Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用于匹配不同值的RegEx BackReference_Php_Regex_Pcre - Fatal编程技术网

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 .. "\))"