到目前为止,我有以下正则表达式:
([0-9]+){1}\s*[xX]\s*([A-Za-z\./%\$\s\*]+)
用于字符串,例如:
2x汤,2x肉丸,4x冰茶
我的目的是捕捉订购商品的次数,以及订购商品的名称。
然而,在这个正则表达式中,乘数'x'在标题之前被捕获。 如何才能使x被忽略,以及x(和空格)被捕获后会发生什么?
答案 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]