否定了匹配一系列字符的字符类

时间:2011-03-25 12:54:44

标签: .net regex

我有点问题,因为我有点像一个正则表达式的新手。如果重要的话,我正在使用.NET的Regex类。

首先描述我正在使用正则表达式的数据:

这是我的表达:

(".*[^".]);(.*")

这匹配这两行(它们是大型计算机中表格中较大行的一部分,但基本上看起来像这样):

示例1:7906143476.;180.;903.;1.;1970.;8.;42.;1.;327.;"SST9001";"S;T GORANS SJH "

示例2:2.;"1;AVD INGENJOR ";"N";"J";" ";

并且也匹配这个(我希望它不是没有匹配):

;"U";33.75;777.;" ";

正则表达式的含义是在引号(“)中找到所有分号(;)并用冒号(:)替换它们。它可能并不总是在引号之前和之后都有一个分号(如例1)。我想要的输出是:

7906143476.;180.;903.;1.;1970.;8.;42.;1.;327.;"SST9001";"S:T GORANS SJH "

2.;"1:AVD INGENJOR ";"N";"J";" ";

最后一行应该保持不变,因为它在分号前面有一个点(。)和任意数量的数字。

我希望能够将所有这些可能的行与单个正则表达式匹配。我已经有了多个正则表达式的解决方案,但我想要一个更好的方法。我不是很熟悉负面/正面的前瞻/后退,但我感觉解决方案在那个领域的某个地方。

我首先考虑在否定角色类中进行分组,以便我可以否定.75,这是我不想匹配的第一组$ 1。它可以是任何数字而不是75。

任何帮助都会很棒,因为我根本不擅长正则表达式。

谢谢!

4 个答案:

答案 0 :(得分:1)

那么,换句话说,只有当分号是引用字符串的一部分时,你才想用分号替换分号吗?

假设引号是正确平衡的,并且引用字符串中没有引号(如"2\" by 4\""中所示),那么您可以这样做:

resultString = Regex.Replace(subjectString, 
    @";            # Match a ;
    (?=            # if it's followed by an odd number of ; -- namely:
     [^""\r\n]*    # 0+ non-quote, non-linebreak characters
     ""            # One quote
     (?:           # followed by...
      [^""\r\n]*"" # an even number of non-quote-quote sequences
      [^""\r\n]*""
     )*            # zero or more times
     [^""\r\n]*    # followed by zero or more non-quotes
     $             # until the end of the line.
    )              # End of lookahead", 
    ":", RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace);

答案 1 :(得分:0)

另一个建议:在';'上拆分,然后浏览数组,如果当前字符串以“但不以...结尾”连接,则将其与下一个字符串连接,其间为':',继续此操作直到找到关闭'“'或者到达阵列的末尾。

使用';'连接所有元素并打印。

顺便说一下,'''不能逃脱?这会使所有解决方案的问题复杂化。

答案 2 :(得分:0)

检查此正则表达式:

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

它匹配其中至少有一个分号的引号之间的任何内容,但仅限于引号中的其他内容或引号之外的内容。这可以避免您的问题,我使用您提供的字符串进行检查。

答案 3 :(得分:0)

"[^";\n]*?(;)*?[^";\n]*?“,没有任何外观构造..它的性能应该优于其他建议的解决方案。你要做的就是用冒号替换第1组\1