我有一个响应:
MS1:111980613994 124 MS2:222980613994124
我有以下正则表达式:
MS\d:(\d(?:\r?\n?)){15}
根据正则表达式,"
(?:\r?\n?)
" 部分应该让它匹配组但不捕获它(这样我就可以从组中得到连续的值)。问题是对于 "
MS1:xxx
",它会匹配 [CR][LF]
并将其包括在组中。它应该从捕获中排除...请帮忙解决。
我有一个响应:
MS1:111980613994 124 MS2:222980613994124
我有以下正则表达式:
MS\d:(\d(?:\r?\n?)){15}
(?:\r?\n?)
" 部分应该让它匹配组但不捕获它(这样我就可以从组中得到连续的值)。MS1:xxx
",它会匹配 [CR][LF]
并将其包括在组中。它应该从捕获中排除...(?:...)
语法并不意味着被括号包围的模式将从任何捕获组中排除。
它只意味着由(?:...)
形成的组将成为一个非捕获组,而不是一个新的捕获组。
换句话说:
(?:...)
仅仅是分组(...)
有两个功能:既分组,又捕获捕获组捕获由它们所包含的模式匹配的所有文本,甚至匹配嵌套组的部分(无论它们是否捕获)。
使用正则表达式...
.*(l.*(o.*o).*l).*
...这里有两个捕获组。如果我们将其与hello world
匹配,我们将得到以下捕获:
lo worl
o wo
请注意,组2捕获的文本也被组1捕获。
如果我们将内部组改为非捕获...
.*(l.*(?:o.*o).*l).*
...第1组的捕获内容不会被改变(当匹配同一字符串时),但第2组已不存在:
lo worl
正如您所看到的,如果非捕获组被包含在一个捕获组中,那么包围捕获组将捕获与非捕获组匹配的字符。
非捕获组的目的不是将内容从其他捕获组中排除,而是作为一种方式来分组操作而不进行捕获。
例如,如果要重复一个子字符串,可以编写(?:substring)*
。
如果您真的想忽略嵌入的\r
和\n
,最好的方法是在第二步中将其删除。 您没有说明使用的编程语言,但类似这样的代码(Python)应该可以起作用:
s = re.sub(r'[\r\n]', '', s)
MS\d:(\d){15}(?:\r?\n?)
。如何看待MS\d:(?:(\d)\r?\n?){15}
?