当前位置: 首页 > 知识库问答 >
问题:

在引号中查找管道忽略误报[重复]

束志业
2023-03-14

我正在尝试用空格替换引号中的管道分隔字符。问题是我有很多误报,因为有些字符串为空。我只想在引号之间有文本时替换管道。我使用的正则表达式模式来自另一个stackoverflow帖子,因为我缺乏正则表达式技能。

数据样本:

"Hello"|"Green | Blue"|123.45|""|""|""|5|45

我使用的代码:

internal class Program
{
    public static void Main()
    {
        string pattern = @"(?: (?<= "")|\G(?!^))(\s*[^"" |\s]+(?:\s +[^ 
        ""|\s]+)*)\s*\|\s*(?=[^""] * "")";
        string substitution = @"\1 \2";
        string input = @"""20190430|""Test  Text""|""""|""""|""Manual""|""""|""Machine""|""""|""""|10.00|""""|0.00|||0.00||5600.00||||""A+""|""""|40.00||""""|""Vision Service |Troubleshoot""|57|""Y""|838|""Yellow Maroon""|850||""FL""||||0.00|||||||||||""""||""""||""""|||""""||||||""""||""""|""""||""""|""""||||||""""|""""|""""||||||||1||""";
        RegexOptions options = RegexOptions.Multiline;
        Regex regex = new Regex(pattern, options);
        string result = regex.Replace(input, substitution);
        Console.WriteLine("Result:" + result);
        Console.ReadKey();
    }
}

它很好地取代了“蓝绿色”管道。但它也替换了引号之间的管道,这会在列被删除时破坏文件。

用我正在处理的文件的实际样本更新了代码。正则表达式找到了它,但没有替换管道。遗漏了一些东西。

共有2个答案

文志学
2023-03-14

我的猜测是,我们可能也想在文本中只保留一个空格,这个表达式,

"([^"]+?)\s+\|\s+([^"]+?)"

替换1美元2美元可能有效。

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"""([^""]+?)\s+\|\s+([^""]+?)""";
        string substitution = @"\1 \2";
        string input = @"""Hello""|""Green | Blue""|123.45|""""|""""|""""|5|45";
        RegexOptions options = RegexOptions.Multiline;
        
        Regex regex = new Regex(pattern, options);
        string result = regex.Replace(input, substitution);
    }
}
路奇
2023-03-14

如果双引号之间应该有文本,并且文本应该位于管道的两侧,则可以使用:

(?<=")(\s*[^"\s|]+)\s*\|\s*([^\s"|]+\s*)(?=")

更换时使用1美元2美元

解释

. NET Regex演示

编辑

如果要用双引号之间的空格替换多个管道,可以使用锚来断言上一个匹配结束时的位置。

在替换中使用第一个捕获组,后跟一个空格1美元

(?:(?<=")|\G(?!^))(\s*[^"|\s]+(?:\s+[^"|\s]+)*)\s*\|\s*(?=[^"]*")

解释

  • (?:非捕获组
  • \s*[^”|\s]匹配0次空白字符,然后匹配1次非空白字符或空白字符
  • (?:\s[^“|\s])*重复0次,匹配1个空格字符,后跟1次非|或空格字符

查看另一个。NET正则表达式演示

 类似资料:
  • 问题内容: 我有一个人员,我想查找重复的条目,以约束除以外的所有字段。因此,请使用-method(并因此使用),因为它们已考虑在内。 修改和方法以忽略该字段不是一种选择,因为代码的其他部分依赖于此。 如果我想忽略该字段,Java中最有效的方法是对重复项进行分类? 问题答案: 构建一个以实现您的自然键排序,然后使用基于二进制搜索的重复数据删除。即可为您提供这种能力。 请注意,必须满足通常的反对称性,

  • 问题内容: 我正在寻找正则表达式以在Java中执行以下操作: 一些测试用例: 我遇到的一些摘要: 谢谢! 问题答案: String stringToSplit = This is the string to split; 在这种情况下,结果将为“ This”,“ is”,“ the”,“ string ”,“ split”。 此时您可以 在哪里等于“ This”,依此类推… 希望这可以帮助。

  • 我想既然查询的语法是: 查询的语法是 忽略案例集合查询的语法为: 但这似乎不起作用(它仍然区分大小写)。 想法? 编辑: 它也不是。

  • 我有一个引用另一个文档的文档,我想加入这些文档并根据子文档中数组的内容进行筛选: deployment\u计算机文档: machine\u状态文档: 我使用的是Mongo 3.6,在查找和管道方面取得了一些成功,下面是我在python MongoEngine中使用的对象,它被传递给聚合函数: 这工作得很好,但是我怎么能排除部署机器不活动的结果呢?我觉得它必须进入项目,但找不到有效的条件。感谢任何帮

  • 我试图从一个输入字符串创建一个Perl哈希,但我对原始的“split”有问题,因为值可能包含引号。下面是一个输入字符串示例,以及我的(期望的)结果哈希: 输入字符串的长度是任意的,并且没有设置键的数量。 谢谢! -总部

  • 问题内容: 在发布此内容之前,我仔细阅读了相关问题,并且无法修改任何相关答案以使用我的方法(不擅长使用正则表达式)。 基本上,这是我现有的行: 它们都匹配和之间包含的字符串。我需要正则表达式忽略它们之间包含的转义引号。因此,之间的数据将被忽略,而之间的数据将被忽略。 任何帮助将不胜感激。 问题答案: 对于大多数字符串,您需要允许转义 任何内容 (而不仅仅是转义引号)。例如,你很可能需要允许转义字符