如何命名正则表达式组?

时间:2012-11-23 14:04:34

标签: php regex

我有一个正则表达式:

'/ abc \( (complexRegex)(,complexRegex)*? \) /Uux'

匹配类似:abc(complexStructure,complexStructure,complexStructure)

如何不写两次complexRegex?

4 个答案:

答案 0 :(得分:2)

在基本的PHP中,没办法(除了使用eisberg建议的变量技巧,但它仍然在regexp本身中重复)。在PHP5中,我听说他们使用Oniguruma(Ruby 1.9的扩展正则表达式引擎),但我没有尝试过自己,除了Oniguruma的维基百科页面所说的内容之外,找不到合适的参考。如果是真的,您可以this

/abc:(?<complexRegex>d.f)(,\g<complexRegex>)*:ghi/

例如,通过为模式("abc:def,daf,dif:ghi")指定名称,它将匹配d.f而不重复模式(complexRegex)。

答案 1 :(得分:1)

您使用PHP,可以避免使用变量编写complexRegex!

$complexRegex = 'your complexRegex here';

$regex = '/ abc \( (' . $complexRegex . ')(,' . $complexRegex . ')*? \) /Uux';

另请阅读有关PCRE中的反向引用的信息:http://www.php.net/manual/en/regexp.reference.back-references.php

答案 2 :(得分:0)

您可以将0或1逗号与?

匹配
'/ abc \((,?(complexRegex))* \)/

我添加了空格以使其更清晰,但您应该在任何需要的地方匹配任意数量的空白区域。

答案 3 :(得分:-1)

您也可以使用backreferences例如

(x[ms]l).com/\1    

# the \1 is the backreference which matches the first capture group

将匹配

xml.com/xml
 and 
xsl.com/xsl