0

我有一个正则表达式:

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

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

如何不写两次 complexRegex?

4

4 回答 4

2

在基本的 PHP 中,没有办法(除了使用 eisberg 建议的变量技巧,但它仍然在正则表达式本身中重复)。在 PHP5 中,我听说他们放入了 Oniguruma(Ruby 1.9 的扩展正则表达式引擎),但我自己没有尝试过,除了 Oniguruma 的 Wikipedia 页面说的内容外,找不到像样的参考资料。如果是真的,你可以有这个

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

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

于 2012-11-23T14:21:19.093 回答
1

您在 PHP 中可以避免通过变量编写 complexRegex!

$complexRegex = 'your complexRegex here';

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

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

于 2012-11-23T14:11:40.217 回答
0

You can match 0 or 1 comma with ?

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

I added white space to make it clearer but you should match any number of white spaces wherever required.

于 2012-11-23T14:07:46.780 回答
-1

您还可以使用反向引用,例如

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

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

将匹配

xml.com/xml
 and 
xsl.com/xsl
于 2012-11-23T14:16:46.390 回答