Php 用于匹配不同值的RegEx BackReference
我有一个正则表达式,用于匹配形式Php 用于匹配不同值的RegEx BackReference,php,regex,pcre,Php,Regex,Pcre,我有一个正则表达式,用于匹配形式(val1运算符val2) 这个正则表达式看起来像: (\(\s*([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)\s*([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*\)) (\(\s*([a-zA-Z]+[0-9]*[0-9]+\\\..*\[.]])\s*(ni | in |*.*.\/|\+-|
(val1运算符val2)
这个正则表达式看起来像:
(\(\s*([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)\s*([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*\))
(\(\s*([a-zA-Z]+[0-9]*[0-9]+\\\..*\[.]])\s*(ni | in |*.*.\/|\+-|==|!=|>>注意\g{N}
相当于\1
,也就是说,一个反向引用与相应捕获组匹配的相同值相匹配,而不是模式。不过,这种语法更灵活一些,因为您可以通过在数字之前使用-
来定义相对于当前组的捕获组(即\g{-2},(\p{L})(\d)\g{-2}
将匹配a1a
)
PCRE引擎允许递归子模式。要重复组1的模式,请使用(?1)
,和(?&Val)
递归命名组的模式Val
也可以使用字符类来匹配单个字符,并考虑使用<代码> ./C> >量词,使正则表达式的部分可选:
(\(\s*(?P<Val>[a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|[*\/+-]|[=!><]=|[><])\s*((?&Val))\s*\))
(\(\s*(?P[a-zA-Z]+[0-9]*.[0-9]+.\\\[.*])\s*(ni | in.[*\/+-].[=!>您在哪种语言/应用程序中使用此正则表达式?
如果您有这个选项,您可以将不同的部分指定为命名变量,然后通过组合它们来构建最终的正则表达式
val = "([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])"
op = "(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)"
exp = "(\(" .. val .. "\s*" .. op .. "\s*" .. val .. "\))"
val=“[a-zA-Z]+[0-9]*|[0-9]+|\'.\'.\\\[.\])”
op=“(在PCRE中,应该是(?&Val)
,而不是\g{Val}
。你的正则表达式引擎是什么?对不起,我忘了给它加标签了。请注意,(?&Val)
,必须将(?&Val)
打包到一个单独的捕获组中才能捕获一个值,因此(?&Val>)
。感谢您的建议,我将更改数组和字符串匹配器:)+1btw如果我想匹配递归表达式,如((a+1)==(b*5))
。在这种情况下,我的表达式将只匹配两个表达式(a+1)
和(b*5)
如何调整它以匹配整个表达式!?如果应用递归,将丢失其中的捕获。是否确实要使用它?使用基本表达式将所有嵌套的括号与/\((?>[^()]+++|(?R))*\)匹配/
然后用你的表达式解析每一个。或者去掉所有这些花哨的东西,使用。是的,我也想知道这一点也是出于好奇:)我实际上是这样做的,但我是出于好奇而问的:D
val = "([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])"
op = "(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)"
exp = "(\(" .. val .. "\s*" .. op .. "\s*" .. val .. "\))"