我今天想了解更多有关正则表达式的信息.
我只是想匹配一个没有括号括起来的订单号(#1234但不是[#1234]),但我的问题更多的是关于在任意模式上使用前瞻断言.
在我的第一次尝试中,我注意到我的负向前瞻匹配\d+(?!\])将导致\d+保持匹配的数字,直到它没有跟随].我需要数字才能匹配,只要它们的整体后面没有a ].
我目前的解决方案是通过向前看看]数字链中是否有a来杀死第一位数的匹配.
这是一个标准的方法吗?我只是在前瞻中重复匹配模式.如果这是一个更复杂的正则表达式,我会接近它吗?重复有效匹配,然后是无效匹配,并让正则表达式引擎为每个字母重复一次?
对于有效匹配,它必须与匹配中的字符匹配多次.
(?<!\[) # not preceded by [
#\d+
(?!\d*\]) # not followed zero+ digits and ]
# or (?!\d|\]) # not followed by digit or ]
Run Code Online (Sandbox Code Playgroud)
我很感激任何反馈!
你可以通过使用占有量词和这样的外观来实现你想要的
(?<!\[)#\d++(?!\])
Run Code Online (Sandbox Code Playgroud)
你的情况下的问题是当你使用\d+它时允许回溯并最终得到部分匹配#123.一旦将其更改为占有量词,它就不会回溯,只有在数字序列不在括号之前/后面时才匹配.
编辑 如果不支持所有格量词,则可以使用此量词
#\d(?<!\[#\d)(?!\d*\])\d*
Run Code Online (Sandbox Code Playgroud)