我有一个正则表达式,用于匹配(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正则表达式来查找大写字符串,也可以从文本中包含一个数字和空格。例如,从此文本"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+)*))…