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

标签 c# regex

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

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/

相关文章:

c# - 用 Mono.Cecil 替换类

c# - VisualStudio 生成的类图不会自行更新

c# - .net core 中的 Func delegate 是如何进行逆变工作的

c# - 使用 DataContractJsonSerializer 将 JSON 反序列化为抽象列表

用于冒号的 Javascript 正则表达式?

c# - 如何将 DataGridView 文本框列设置为多行?

java - 将整个句子与正则表达式匹配

mysql - 如何将具有多个值的 WHERE IN 子句转换为 RegExp 或 Like

java - 正则表达式字符类双重否定中的错误?

javascript - 零次或多次匹配对于零次匹配无法正常工作