Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何命名regexp组?_Php_Regex - Fatal编程技术网

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/