Regex 前瞻正则表达式
我希望符合以下模式 (一) 10位数字文本(如1235873490 ABCD EFGK) 在文本中,可能有上面的模式,以及类似的模式 (二) 10位文本十进制数字(例如9835873490 VBGF XMF 23.233) 如何编写正则表达式以仅匹配模式(1)和忽略模式(2) 我已经用类似这样的方法研究了负面表情:Regex 前瞻正则表达式,regex,boost,Regex,Boost,我希望符合以下模式 (一) 10位数字文本(如1235873490 ABCD EFGK) 在文本中,可能有上面的模式,以及类似的模式 (二) 10位文本十进制数字(例如9835873490 VBGF XMF 23.233) 如何编写正则表达式以仅匹配模式(1)和忽略模式(2) 我已经用类似这样的方法研究了负面表情: (\d{10})\s*([A-Za-z0-9]+(?:\s+[A-Za-z0-9]+)(?:\s+[A-Za-z0-9]+))\s*(?!(\d+.\d+)) 但却无法让它发挥作用
(\d{10})\s*([A-Za-z0-9]+(?:\s+[A-Za-z0-9]+)(?:\s+[A-Za-z0-9]+))\s*(?!(\d+.\d+))
但却无法让它发挥作用。有什么想法吗?顺便说一下,我使用C++ Boo::ReEX.
,首先从简单的版本开始:
(\d{10} # 10 digits
(?:\s+\w+)+) # some text, separated by spaces,
# at least one time
(?!\s*\d+\.\d+) # not followed by a decimal number
为了简单起见,我将您的[A-Za-z0-9]
更改为\w
,并允许它出现任意次数
但是,这也将匹配第二个字符串-它将在末尾吞掉23
,然后看到后面没有十进制数字(后面跟着“.23”),因此它将匹配
为了防止出现这种情况,我们可以说它后面必须有空格或文本结尾:
(\d{10}(?:\s+\w+)+)
(?=\s|$) # it must be followed by a space or end of text
(?!\s*\d+\.\d+)
然而,这仍然有一个问题。现在,它将匹配到“…XMF”,但随后会看到后面跟着一个十进制数字,并返回。它将返回到“…VBGF”,然后匹配,因为“VBGF”后面没有小数
为了防止出现这种情况,我们可以告诉正则表达式,一旦匹配了我们的主要部分,它就不能回溯:
(?> # added '?>': not allowed to backtrack once this group is matched
\d{10}(?:\s+\w+)+)
(?=\s|$)(?!\s*\d+\.\d+)
或者,如果您知道sometext中始终有两个部分,这也将解决回溯问题:
(\d{10}(?:\s+\w+){2} # can only occur twice
)
(?=\s|$)(?!\s*\d+\.\d+)