Php 如何命名regexp组?
我有一个正则表达式:Php 如何命名regexp组?,php,regex,Php,Regex,我有一个正则表达式: '/ abc \( (complexRegex)(,complexRegex)*? \) /Uux' 匹配如下内容:abc(complexStructure,complexStructure,complexStructure) 如何不写两次complexRegex?您可以将0或1个逗号与之匹配 '/ abc \((,?(complexRegex))* \)/ 我添加了空格以使其更清晰,但您应该在需要时匹配任意数量的空格。您使用的是PHP,您可以避免使用变量编写compl
'/ abc \( (complexRegex)(,complexRegex)*? \) /Uux'
匹配如下内容:abc(complexStructure,complexStructure,complexStructure)
如何不写两次complexRegex?您可以将0或1个逗号与之匹配
'/ abc \((,?(complexRegex))* \)/
我添加了空格以使其更清晰,但您应该在需要时匹配任意数量的空格。您使用的是PHP,您可以避免使用变量编写complexRegex
$complexRegex = 'your complexRegex here';
$regex = '/ abc \( (' . $complexRegex . ')(,' . $complexRegex . ')*? \) /Uux';
还可以阅读PCRE中的反向引用:您也可以使用
将匹配
xml.com/xml
and
xsl.com/xsl
在基本PHP中,没有任何方法(除非像eisberg建议的那样使用变量技巧,但它仍然在regexp本身中重复)。在PHP5中,我听说他们加入了Oniguruma(Ruby 1.9的扩展regexp引擎),但我自己没有尝试过,除了Oniguruma的Wikipedia页面上说的以外,找不到合适的参考资料。如果这是真的,您可以:
/abc:(?d.f)(,\g)*:ghi/
例如,它将通过为模式(
complexRegex
)指定一个名称来匹配“abc:def,daf,dif:ghi”
,而不重复模式(d.f
)。这将匹配不等价的abc(complexstructure complexstructure),因为它也将匹配“,complexstructure complexstructure”
-即使它的语法形式很好,也要看一看,这就是你要找的东西。@eisberg:和garyh的评论一样。。。变量技巧很好,但是这里的反向引用对于这里的场景来说可能太有限了。@Amadan谢谢您的评论。我从来没有在任何项目中看到过有反向引用的工作示例。因此,我不想包括一个示例,但还是提到了它。如果我想在$complexRegexp中命名某些组,那么这就行不通了:警告编译失败:两个命名的子模式在offsetYou处具有相同的名称,您只能对完全相同的字符串区域使用反向引用;我怀疑OP希望他们的complexRegex
更加灵活(并且在每种情况下都可能有所不同)。@Amadan你可能有点道理。尽管如此,它还是让我阅读了反向引用,现在我知道的比一小时前多。PHP仍然使用PCRE库,但PCRE采用了“命名”子例程语法(\g
)以与Oniguruma兼容。(参考:并搜索ONIGURUMA子例程语法
)@Alanmore:我使用维基百科的“Ruby编程语言,自1.9版起,以及PHP的多字节字符串模块(自PHP5起),使用ONIGURUMA作为其正则表达式引擎”,链接的日本源代码在那里链接说,自从PHP RC1用于mbstring
,Oniguruma是如何捆绑的mb_ereg
应该是使用它的函数之一。我自己还没试过:)preg_match
,朋友们显然是PCRE(因此前缀是“p”)。我不知道PCRE是否采用了这些特性;谢谢
xml.com/xml
and
xsl.com/xsl
/abc:(?<complexRegex>d.f)(,\g<complexRegex>)*:ghi/