Regex 前瞻正则表达式

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+)) 但却无法让它发挥作用

我希望符合以下模式

(一)

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+))

但却无法让它发挥作用。有什么想法吗?顺便说一下,我使用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+)