我正在努力了解有关正则表达式的更多信息。
我只是想匹配一个没有括号(#1234
而不是[#1234]
)的订单号,但我的问题更多的是关于在任意模式上使用先行断言。
在我第一次尝试时,我注意到我的否定前瞻匹配\d+(?!\])
会导致\d+
保持匹配的数字,直到]
后面没有。我需要数字才能匹配,只要它们的整数后面没有]
。
我当前的解决方案通过展望未来数字链中是否有]
来杀死第一位数的匹配。
这是一个标准的方法吗?我只是在前瞻中重复匹配模式。如果这是一个更复杂的正则表达式,我会接近它吗?重复有效匹配,然后是无效匹配,让正则表达式引擎为每个字母重复一次吗?
对于有效匹配,它必须与匹配中的字符匹配多次。
(?<!\[) # not preceded by [
#\d+
(?!\d*\]) # not followed zero+ digits and ]
# or (?!\d|\]) # not followed by digit or ]
我很感激任何反馈!
答案 0 :(得分:8)
你可以通过使用占有量词以及类似这样的外观来实现你想要的目标
(?<!\[)#\d++(?!\])
您的案例中的问题是,当您使用\d+
时,它允许回溯并最终获得部分匹配#123
。一旦你将其改为占有量词,它就不会回溯,只有在数字序列不在括号之前/之后才匹配。
修改强> 如果不支持占有量词,那么你可以使用这个
#\d(?<!\[#\d)(?!\d*\])\d*