【问题标题】:Regex - Not matching NewLine when it should?正则表达式 - 不匹配 NewLine 什么时候应该?
【发布时间】:2013-02-15 18:51:31
【问题描述】:

承诺,我的正则表达式问题有一段时间了。 ..真的。

我在不应该的情况下以某种方式将换行符添加到某些匹配项中,并且我确定这是我误解的内容,或者,我得到的数据不是我所期望的。 (这是可能的..!)

我定义了一个正则表达式: new Regex(@"^\s*[0-9]{4}[A-Z]{2}[\s\*]\s*(?<token>.*?)\-(?<value>.*?)$", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);

我得到的文档/字符串被格式化为偶尔出现的一行:

0000AA Token1     - Value
0000AA Token2     - Value
0000AA Token3     - Value
0000AA Another Tok- Value

当我像这样按顺序获取所有令牌时,上面的正则表达式效果很好。我得到了四场比赛:

Match# <token> <value>
1      Token1      Value
2      Token2      Value
3      Token3      Value
4      Another Tok Value

这很好。但是,有时用户会向我发送一个文件,其中令牌偶尔会丢失行,如:

0000AA Token1     - Value
0000AA Token2     - Value
0000AA Token3     - Value
0000AA
0000AA Another Tok- Value

发生这种情况时,我的正则表达式会给我以下值:

Match# <token>           <value>
1      Token1             Value
2      Token2             Value
3      Token3             Value
4      0000AA Another Tok Value

我知道为什么,它与 #4 的标记匹配,从它上面的行开始。但是,当我将 'token' 分组更改为 (?&lt;token&gt;[^\n]*?) 时,我仍然在 'token' 中得到相同的值。

我觉得我遗漏了一些明显的东西,因为如果 .在不应该匹配换行符的时候匹配换行符,比我更多的人会因为它而引起骚动。我检查了传入的字符串 - 换行符是 \n,而不是 \r\n,但想知道是否还有其他问题。

再次干杯 - 迈克。

【问题讨论】:

    标签: regex c#-4.0


    【解决方案1】:

    问题出在\s开头的字母数字代码后面; \s 也匹配换行符,而您不想这样做。您基本上需要匹配 \s 而不是 \n。这用正则表达式是无法表达的,但是如果你使用德摩根定理,你可以重写这个表达式:

    \s AND NOT \n = NOT(NOT \s OR \n)
    

    原来NOT \s可以写成\S

    \s AND NOT \n = NOT(NOT \s OR \n) = NOT(\S OR \n)
    

    这很容易用正则表达式表达:

    \s AND NOT \n = NOT(NOT \s OR \n) = NOT(\S OR \n) = [^\S\n]
    

    因此,使用 [^\S\n] 代替 \s,这意味着 匹配除换行符之外的所有内容,以及 \s 的否定 em>。

    我在同一区域做了一些其他更改,因为我觉得有些东西是不必要的。如果您认为是,可以将其添加回来。

    Regex re = new Regex(@"^[0-9]{4}[A-Z]{2}[^\S\n]*(?<token>.*?)\-(?<value>.*?)$", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);
    

    【讨论】:

    • 哇,谢谢。我觉得自己像个傻瓜——我从来没有意识到换行符被认为是空格。 (尽管如此,它确实有道理!)关于双重否定的好技巧,也是 - 我从来没有这样想过。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2014-07-31
    • 2018-06-23
    • 2022-01-04
    相关资源
    最近更新 更多