为什么我的正则表达式组合了来自不同行的捕获组

时间:2014-11-20 01:33:04

标签: regex

我有以下正则表达式:

(?<prefix>\S*?)\h*(?<score>\d+[+-]?)\s*(?<suffix>.*?(?:[A-Z]{2}|\d{2})[A-Z]{2}\d{2})

当目标文本包含三个捕获组中的每一个时,表达式工作正常,但在不是这种情况时会产生奇怪的结果。例如,以下文本产生了这些结果:

^15+ vwu&ob12Ai18 => This one works. All three groups 

^15+  => This does not produce a match

vwu&ob12Ai18  => This does not produce a match

15+ vwu&ob12Ai18 =>  This one works - matching the 2nd and 3rd capture group.

前缀 - 应匹配字符串开头的各种字符。在这个例子中它是克拉,但其他潜在的字符包括:。 = F G~仅举几例。前缀有一个特定的字符列表。

图 - 是一个或两个数字的数字,可选地后面没有任何内容,加号(+),减号( - )或双引号(“)。

后缀 - 后缀是其他所有内容。后缀有一个特定的字符列表。

我在Regex 101有一个样本。注意 - 正则表达式101样本似乎组合线来创建匹配,但如果您一次查看一个字符串,您将得到与上面相同的结果。

我的问题是我应该如何更改我的正则表达式,以便我可以匹配上面的每个示例字符串。

更新:我在Regex 101上花了一些时间,并提出了一个比原版表现更好的正则表达式。这更像是一种蛮力方法,因为它不包括非捕获组。

^(?<prefix>[\^\s])?(?<figiure>[\d+-\s]{0,5})?\s?(?<suffix>[vwu&ob1\dAi]{0,19})?$

我猜测有一个更优雅的解决方案,但至少这是朝着正确方向迈出的一步。

1 个答案:

答案 0 :(得分:1)

你的(x模式):

(?<prefix>\S*?)\h*
(?<score>\d+[+-]?)\s*
(?<suffix>.*?(?:[A-Z]{2}|\d{2})[A-Z]{2}\d{2})

(可能)正确(我们已经确定in chat使用的正则表达式引擎是VBScript正则表达式5.5,因此没有命名组

^
(\D+?(?=\d+["+-]?[ ]))?
(\d+["+-]?[ ])?
(.*)

http://regex101.com/r/sF2wV7/6

匹配线时要做的事情:

  • 之前:在末尾添加一个空格(这实际上非常重要)
  • 之后:修剪各个组的内容