首页 > 解决方案 > php正则表达式中具有相同名称的两个组

问题描述

我有一个包含TXT numberor格式的子字符串的输入number TXT。我想编写匹配格式并仅返回数字的正则表达式。

我想出了这样的事情:

$regex = '/TXT(?<number>[0-9]+)|(?<number>[0-9]+)TXT/'

问题是编译器说number已经定义了带有名称的组,即使两者之间有 or 运算符。

是否可以在 php 中编写 2 个具有相同名称的组?如果不是那么我怎么能写这样的正则表达式?

标签: phpregex

解决方案


要编写 2 个具有相同名称的组,您需要使用(?J)内联标志:

'/(?J)TXT(?<number>[0-9]+)|(?<number>[0-9]+)TXT/'

查看正则表达式演示

文档

J (PCRE_INFO_JCHANGED)
内部(?J)选项设置更改本地PCRE_DUPNAMES选项。允许子模式的重复名称。从 PHP 7.2.0 开始,也支持J作为修饰符。

PHP 演示

$regex = '/(?J)TXT(?<number>[0-9]+)|(?<number>[0-9]+)TXT/';
if (preg_match_all($regex, "TXT123 and 456TXT1", $matches, PREG_SET_ORDER, 0)) {
    foreach ($matches as $m) {
        echo $m["number"] . PHP_EOL;
    }
}

请注意,在您的情况下,您不需要这些组:

'/TXT\K[0-9]+|[0-9]+(?=TXT)/'

环视也将在这里完成工作。


推荐阅读