正则表达式:如何匹配可能含方括号的数字并解决命名组重复错误?
正则捕获组重名问题解决及数字提取方案
报错原因
你写的正则里两个分支都用了<number>这个命名捕获组,多数正则引擎不允许重复定义同名的捕获组,所以才会抛出“子模式名称必须唯一”的错误。
最简修正方案
直接合并两种匹配场景,只定义一次命名捕获组,正则如下:
\w+\.(?:\[?(?<number>\d+)\]?)\.\w+
拆解逻辑:
\[?:匹配可选的左方括号(有则匹配,没有也不影响)(?<number>\d+):唯一的命名捕获组,专门提取中间的数字\]?:匹配可选的右方括号?::把方括号和数字的组合设为非捕获组,避免生成多余的无效捕获结果
这个正则能同时匹配"prefix.[10].suffix"和"prefix.10.suffix",并且精准提取出数字10。
分支式兼容写法(可选)
如果一定要保留分支结构,可以调整为用非命名捕获组包裹分支,再在外层定义命名组(不过不如上面的方案简洁):
\w+\.(?<number>(?:\[(\d+)\]|(\d+)))\.\w+
这种写法里,number组会捕获带方括号或不带的内容,之后需要手动去掉方括号来提取纯数字,因此更推荐第一种方案。
内容的提问来源于stack exchange,提问作者dzmitry_ivanou
相关产品推荐
相关产品推荐

