我不明白我的正则表达式是怎么回事。下面我有一个伪代码:
string patternRegex="^(?<GROUP_1>[1-4][0-9]|7[3-9]|8[0-9])(?<GROUP_2>(\\d{5}))$"
Regex regex = new Regex(patternRegex, RegexOptions.Compiled);
var groupNames = regex.GetGroupNames();
字符串
我希望GetGroupNames()
应该返回两个组(GROUP_1
和GROUP_2
),但在本例中,它返回了4个组。
- 0个
1.一个
1.第1组
1.第二组
当我尝试匹配字符串时:1395614
,则组值为:
1.小行星1395614
1.小行星95614
1.十三个
1.小行星95614
我已经在谷歌上搜索过了,我在什么地方读到0
组代表完整的比赛。GROUP_1
和GROUP_2
的值也是正确的。
但是1
(我在这里不是问GROUP_1
)代表什么呢?
.NET小提琴:https://dotnetfiddle.net/Bfgv9s
2条答案
按热度按时间gzjq41n41#
为了避免使用索引为1的默认未命名捕获组,您应该将regexp重写为
第一个月
对于第一个捕获组
GROUP_1
,使用(?:[1-4][0-9]|7[3-9]|8[0-9])
而不是[1-4][0-9]|7[3-9]|8[0-9]
。(?:...)
是一个非捕获组,它允许我们在不创建捕获组的情况下对模式的部分进行分组。它确保此部件的匹配项不会分配给捕获组。对于第二个捕获组
GROUP_2
,使用(?:\\d{5})
而不是\\d{5}
。同样,(?:\\d{5})
是一个非捕获组。mm9b1k5b2#
你确实有完整的比赛。你也有一个组为每个括号夫妇。
基本上你也有这样的比赛:(\d{5}),捕获为组“1”
您可以通过以下方式访问捕获的组:
字符串
为了防止组被捕获,只需将代表
non capturing group
的?:
添加到(\d{5})
组。它应该看起来像:
(?:\d{5})
的值。