使用Regex.Matches计算字符串中特定单词时出错

时间:2014-06-28 13:02:47

标签: c# regex

我试图找到一种方法来计算字符串中的特定单词,我发现了这一点。

using System.Text.RegularExpressions;

MatchCollection matches = Regex.Matches("hi, hi, everybody.", ",");
int cnt = matches.Count;
Console.WriteLine(cnt);

工作正常,结果显示2。 但是,当我将“,”改为“。”时,它显示18,而不是预期的1.为什么?

MatchCollection matches = Regex.Matches("hi, hi, everybody.", ".");

当我将“,”更改为“(”时,它显示错误! 错误如下:

SYSTEM.ARGUMENTEXCEPTION - THERE ARE TOO MANY (...

我不明白为什么会发生这种情况

MatchCollection matches = Regex.Matches("hi( hi( everybody.", "(");

其他情况似乎工作正常,但我需要计算“(”。

3 个答案:

答案 0 :(得分:2)

使用.的第一个实例使用的是一个特殊字符,它在正则表达式中具有不同的含义。它匹配你拥有的所有角色;因此你得到18的结果。

http://www.regular-expressions.info/dot.html

匹配实际的"。"性格,你需要"逃避"这样它就被视为一个完整的而不是一个特殊的角色。

MatchCollection matches = Regex.Matches("hi, hi, everybody.", "\.");

(字符也存在相同的情况。它是一个特殊的角色,在正则表达式方面具有不同的含义,你需要逃避它。

MatchCollection matches = Regex.Matches("hi( hi( everybody.", "\(");

看起来你对正则表达式不熟悉,所以我建议阅读,我上面发布的链接是一个好的开始。

无论其!

如果您只想计算一个字符串中的ocncences,那么您就不需要正则表达式。

How would you count occurrences of a string within a string?

如果您使用的是.NET 3.5,可以使用LINQ在单行中执行此操作:

int cnt = source.Count(f => f == '(');

如果您不想使用LINQ,可以使用:

int cnt = source.Split('(').Length - 1;

答案 1 :(得分:1)

第二个参数表示一个模式,不一定只是要在字符串中搜索的字符,而(本身就是一个无效的模式。

您不需要正则表达式来计算字符的出现次数。只需使用LINQ的Count()

var input = "hi( hi( everybody.";

var occurrences = input.Count(x => x == '(');  // 2

答案 2 :(得分:1)

(字符是一个特殊字符,表示group的开头。如果您需要使用(作为文字,则需要使用\(将其转义。这应该可以解决你的问题。