gpt4 book ai didi

正则表达式 - 什么时候不匹配 NewLine?

转载 作者:行者123 更新时间:2023-12-01 01:12:02 27 4
gpt4 key购买 nike

保证,我的最后一个正则表达式问题。 ..真的。

当我不应该在某些比赛中加入换行符时,我不知何故,我确信这是我误解的东西,或者,我得到的数据不是我所期望的。 (这是可能的..!)

我定义了一个正则表达式: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

当我像这样按顺序获取所有 token 时,上面的正则表达式效果很好。我得到四场比赛:
Match# <token> <value>
1 Token1 Value
2 Token2 Value
3 Token3 Value
4 Another Tok Value

这很好。但是,有时用户会向我发送一个文件,其中 token 偶尔会丢失一行,如下所示:
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 ”分组更改为 (?<token>[^\n]*?) 时,我仍然在“ token ”中获得相同的值。

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

再次欢呼——
麦克风。

最佳答案

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

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

原来是 不是\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 使用 [^\S\n] ,这意味着匹配除换行符之外的所有内容,以及\s 的否定。

我在同一领域做了一些其他的改变,因为我觉得有些东西是没有必要的。如果您认为是,您可以将其添加回来。
Regex re = new Regex(@"^[0-9]{4}[A-Z]{2}[^\S\n]*(?<token>.*?)\-(?<value>.*?)$", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture);

关于正则表达式 - 什么时候不匹配 NewLine?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14901433/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com