提问者:小点点

.NET正则表达式匹配返回的元素太多


根据此问题/答案,我使用以下正则表达式解析括号中数字的名称,给出:

  1. 开头括号左边的名字,空白左/右去掉
  2. 括号中的数字

使用我的C#代码:

var found = Regex.Match("morleyc (1005)", @"(\S*)\s*\((\d*)", RegexOptions.IgnoreCase)

我得到一个3个项目的数组,而我希望一个2个元素数组只包含第二个和第三个项目:

morleyc (1005
morleyc
1005

这就是我所期望的(根据regexstorm.net元素):

morleyc
1005

请告知我在代码中做错了什么?

.净小提琴@https://dotnetfiddle.net/5DVWPs


共3个答案

匿名用户

也许,你想要

 @"(?<name>\w+)\s*\((?<number>[0-9]+)\)"

模式,在哪里

 \w+        - one or more word (letter or digit) characters for name
 \s*        - optional (zero or more) whitespaces
 \([0-9]+\) - one or more digits in parenthesis for number

注意:命名捕获组:

 (?<name> ... )    - part of the match which stands for name
 (?<number>  ... ) - -/- stands for number

如果名称只能包含字母(不允许数字),则可以

 @"(?<name>\p{L}+)\s*\((?<number>[0-9]+)\)"

模式,其中\p{L}表示unicode字母

演示:

var found = Regex.Match(
  "morleyc (1005)", 
 @"(?<name>\w+)\s*\((?<number>[0-9]+)\)", 
   RegexOptions.IgnoreCase);
        
Console.WriteLine($"Name: {found.Groups["name"].Value}");
Console.WriteLine($"Number: {found.Groups["number"].Value}");

结果:

Name: morleyc
Number: 1005

小提琴

匿名用户

结果中的morleyc(1005部分是完全匹配。模式也不匹配关闭

您可以检查是否存在匹配,如果存在,则仅获取组1和组2的值。

请注意,在模式中,除了)之外,几乎所有内容都是可选的,因此它也可以匹配单个

var found = Regex.Match("morleyc (1005)", @"(\S*)\s*\((\d*)\)", RegexOptions.IgnoreCase);
if (found.Success) {
    Console.WriteLine(found.Groups[1].Value);
    Console.WriteLine(found.Groups[2].Value);
}

看小提琴。

输出

morleyc
1005

更具体的模式可能是:

(\S+)[\p{Zs}\t]+\(([0-9]+)\)
  • (\S)捕获组1,匹配1个非空白字符

.NET正则表达式演示

匿名用户

你做得很对。根据。NET留档:

Groups属性返回的GroupCollection对象的第一个元素(索引0处的元素)包含与整个正则表达式模式匹配的字符串

因此,带有2个组的正则表达式模式将返回3个结果:

  1. 匹配模式的字符串
  2. 第一组
  3. 第二组