php - php正则表达式中具有相同名称的两个组
问题描述
我有一个包含TXT number
or格式的子字符串的输入number TXT
。我想编写匹配格式并仅返回数字的正则表达式。
我想出了这样的事情:
$regex = '/TXT(?<number>[0-9]+)|(?<number>[0-9]+)TXT/'
问题是编译器说number
已经定义了带有名称的组,即使两者之间有 or 运算符。
是否可以在 php 中编写 2 个具有相同名称的组?如果不是那么我怎么能写这样的正则表达式?
解决方案
要编写 2 个具有相同名称的组,您需要使用(?J)
内联标志:
'/(?J)TXT(?<number>[0-9]+)|(?<number>[0-9]+)TXT/'
查看正则表达式演示
文档:
J (PCRE_INFO_JCHANGED)
内部(?J)
选项设置更改本地PCRE_DUPNAMES
选项。允许子模式的重复名称。从 PHP 7.2.0 开始,也支持J作为修饰符。
$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)/'
环视也将在这里完成工作。
推荐阅读
- wordpress - wp_localize_script 不接受动态值
- php - 按字母顺序按首字母分组
- javascript - typeError:无法在角度 9.0.4 中分配给对象“[object Object]”的只读属性“tView”
- gensim - 如何理解 gensim 的 iter 参数及其对预处理的影响?
- php - 从 JSON 到 PHP 获取特定值
- php - 在 Laravel 控制器中加入两个数据库表
- java - 无法将 Junit 添加到我的 Maven 项目(Netbeans)
- html - 为什么颜色不会变回黑色?
- kubernetes - 如何保持 kubernetes pod 的状态相同或自动恢复
- bash - 从另一个文件 sh 赋值