如何在正则表达式中排除第一个匹配项?

时间:2011-11-22 10:42:24

标签: c# .net regex

到目前为止,我有以下正则表达式:

([0-9]+){1}\s*[xX]\s*([A-Za-z\./%\$\s\*]+)

用于字符串,例如:

  

2x汤,2x肉丸,4x冰茶

我的目的是捕捉订购商品的次数,以及订购商品的名称。

然而,在这个正则表达式中,乘数'x'在标题之前被捕获。 如何才能使x被忽略,以及x(和空格)被捕获后会发生什么?

1 个答案:

答案 0 :(得分:2)

你不能忽视模式中间的某些东西。因此,您确实拥有捕获组。

([0-9]+){1}\s*[xX]\s*([A-Za-z\./%\$\s\*]+)
^^^^^^^^             ^^^^^^^^^^^^^^^^^^^^^

模式的标记部分存储在捕获组中,因为它们周围有括号。

您的号码在第1组,名称在第2组中。“x”未在组中捕获。

您现在如何访问群组取决于您使用的语言。

顺便说一下。 {1}已过时。

所以对于c#试试这个:

string text = "2x Soup, 2x Meat Balls, 4x Iced Tea";
MatchCollection result = Regex.Matches(text, @"([0-9]+)\s*[xX]\s*([A-Za-z\./%\$\s\*]+)");

int counter = 0;

foreach (Match m in result)
{
    counter++;
    Console.WriteLine("Order {0}: " + m.Groups[1] + " " + m.Groups[2], counter);
}
Console.ReadLine();

此外我会将正则表达式更改为此,因为看起来您希望匹配每个字符的名称,直到下一个逗号

@"([0-9]+)\s*x\s*([^,]+)"

并使用RegexOptions.IgnoreCase来避免编写[xX]