RegEx BackReference以匹配不同的值 - php

我有一个正则表达式,用于匹配(val1 operator val2)形式的Expression

这个正则表达式看起来像:

(\(\s*([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)\s*([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*\))

正如您所见,这实际上很好,并且符合我想要的here in this demo

但是:D(黄油来了)

我想通过使其更易读和“紧凑”来优化正则表达式本身。我搜索了如何执行此操作,然后找到了一种称为反向引用的名称,您可以在其中命名捕获组,然后像下面这样引用它们:

(\(\s*(?P<Val>[a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)\s*(\g{Val})\s*\))

在这里我命名了捕获表达式Val左侧的组,后来我将其引用为(\g{Val}),现在的问题是,正如您可以看到的here那样,此表达式仅在表达式的左侧恰好是和右边一样!例如(a==a)(1==1)且与(a==b)之类的表达式不匹配!

现在的问题是:有没有办法引用模式而不是匹配的值?

参考方案

请注意,\g{N}等效于\1,即,反向引用与相应的捕获组匹配的值(而不是模式)匹配。但是,此语法稍微灵活一些,因为您可以在数字前使用-定义相对于当前组的捕获组(即\g{-2}(\p{L})(\d)\g{-2}将匹配a1a)。

PCRE引擎允许subroutine calls递归子模式。要重复组1的模式,请使用(?1)(?&Val)递归命名组Val的模式。

另外,您可以使用字符类来匹配单个字符,并考虑使用?量词使正则表达式的某些部分可选:

(\(\s*(?P<Val>[a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|[*\/+-]|[=!><]=|[><])\s*((?&Val))\s*\))

请参见regex demo

请注意,\'.*\'\[.*\]可能匹配太多,请考虑将其替换为\'[^\']*\'\[[^][]*\]

php regex-查找文本中带数字和空格的大写字符串 - php

我想编写php正则表达式来查找大写字符串,也可以从文本中包含一个数字和空格。例如,从此文本"some text to contain EXAM PL E 7STRING uppercase word"我要获取字符串-EXAM PL E 7STRING,找到的字符串应仅以大写字母开头和结尾,但在中间,不带大写字母的字母也可以包含(但不一定)…

PHP:正则表达式,用于用硬破空格替换数字之间的空格 - php

我想创建一个正则表达式,根据我的国家印刷规则,将常规空间替换为难以破解的空间。它不应触摸HTML标签。这些示例中的所有空格都应艰辛:号码1 000 10 000 100 000 1 000 000 etc.. 日期17. 6. 17. 6. 2012 我想出了:$pattern = '/((\d\.?)\s(\d))(?=[^>]*(<…

如何修改此正则表达式以包含https? - php

我使用了这段正则表达式,用于根据输入到textarea中的URL创建可点击的链接。我没有编写代码,也不确定如何修改它,以便在文本以http或https开头的情况下创建链接。$html = preg_replace('"\b(http://\S+)"', '<a href="$1"&g…

正则表达式的字母数字 - php

我有这个PHP正则表达式:$username = preg_replace('/[^a-z0-9]/i', '', $username); 它仅允许A-Z和0-9。如何允许同时使用.,-和_? 参考方案 您可以使用以下正则表达式:/[^a-z0-9._-]/i 我最后是要做出模式匹配不区分大小写。您可以放下并使用:/[…

等号后如何提取数据? - php

到目前为止,我已经编写了此正则表达式,但无法从以下位置获取正确的数据:一些文字:TST =我需要的数据,TSA =我需要比较的更多内容,SMT =我需要的更多在等号前加2到3个大写字母,然后对其进行数据处理直到逗号为止。preg_match_all("/Some\s+text:\s+(?:([A-Z]{2,3})(?:\s+\=(\s\w+)*))…