我有一个正则表达式:
'/ abc \( (complexRegex)(,complexRegex)*? \) /Uux'
匹配类似:abc(complexStructure,complexStructure,complexStructure)
如何不写两次complexRegex?
答案 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