gpt4 book ai didi

c# - 在 C# 正则表达式中,为什么初始匹配出现在组中?

转载 作者:可可西里 更新时间:2023-11-01 08:09:54 28 4
gpt4 key购买 nike

因此,如果我编写一个匹配的正则表达式,我可以获得匹配项或者我可以访问它的组。这似乎违反直觉,因为组是在表达式中用大括号“(”和“)”定义的。这似乎不仅是错误的,而且是多余的。有谁知道为什么吗?

Regex quickCheck = new Regex(@"(\D+)\d+");
string source = "abc123";

m.Value //Equals source
m.Groups.Count //Equals 2
m.Groups[0]) //Equals source
m.Groups[1]) //Equals "abc"

最佳答案

我同意 - 这有点奇怪,但我认为这是有充分理由的。

Regex Match 本身就是一个 Group,它又是一个 Capture

Match.Value(或 Capture.Value 实际上是这样)仅在字符串中存在一个匹配项时才有效 - 如果您匹配多个模式的实例,那么根据定义它不能返回所有内容。实际上 - Match 上的 Value 属性在只有匹配项时很方便。

但要阐明这种将整个匹配项传递到 Groups[0] 的行为在哪里有意义 - 考虑这个(人为的)朴素代码 unminifier 示例:

[TestMethod]
public void UnMinifyExample()
{
string toUnMinify = "{int somevalue = 0; /*init the value*/} /* end */";
string result = Regex.Replace(toUnMinify, @"(;|})\s*(/\*[^*]*?\*/)?\s*", "$0\n");
Assert.AreEqual("{int somevalue = 0; /*init the value*/\n} /* end */\n", result);
}

正则表达式匹配将在语句末尾保留/* */注释,然后放置一个换行符 - 但适用于任何一个;或 } 行尾。

好吧 - 你可能想知道为什么你会费心用正则表达式来做这个 - 但请原谅我:)

如果此正则表达式的匹配生成的 Groups[0] 不是整个捕获 - 那么单次调用替换是不可能的 - 你的问题可能是问为什么 不会将整个比赛放入 Groups[0] 而不是相反!

关于c# - 在 C# 正则表达式中,为什么初始匹配出现在组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2248213/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com