Regex- GetGroupNames返回的组数超过预期

inkz8wg9  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(72)

我不明白我的正则表达式是怎么回事。下面我有一个伪代码:

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_1GROUP_2),但在本例中,它返回了4个组。

  1. 0个
    1.一个
    1.第1组
    1.第二组
    当我尝试匹配字符串时:1395614,则组值为:
    1.小行星1395614
    1.小行星95614
    1.十三个
    1.小行星95614
    我已经在谷歌上搜索过了,我在什么地方读到0组代表完整的比赛。
    GROUP_1GROUP_2的值也是正确的。
    但是1(我在这里不是问GROUP_1)代表什么呢?
    .NET小提琴:https://dotnetfiddle.net/Bfgv9s
gzjq41n4

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})是一个非捕获组。

mm9b1k5b

mm9b1k5b2#

你确实有完整的比赛。你也有一个组为每个括号夫妇。
基本上你也有这样的比赛:(\d{5}),捕获为组“1”
您可以通过以下方式访问捕获的组:

var match = regex.Match("1395614");
var group1 = match.Groups["GROUP_1"].Value;

字符串
为了防止组被捕获,只需将代表non capturing group?:添加到(\d{5})组。
它应该看起来像:(?:\d{5})的值。

相关问题