Regex.Matches没有返回预期

时间:2015-10-20 15:20:49

标签: c# regex

使用Regex.Matches我的印象是你会输入这样的东西:

    private static int CheckForWordMatch(string offer, string item)
    {
        string pattern = @"\b(" + item + ")\b";
        int count = 0;
        count = Regex.Matches(@offer, pattern).Count;
        return count;
    }

测试参数:

offer = AK47HyperBeastFieldTested
item = AK47HyperBeastFieldTested

我正在寻找精确的单词匹配,以便如果该项目是“AK47HyperBeast”,它将不会返回匹配计数2.

我在这里做错了什么?

2 个答案:

答案 0 :(得分:4)

您忘记使用第二个@)\b的逐字字符串文字。您的")\b"被视为)和退格符。

string pattern = @"\b(?:" + item + @")\b";

See C# demo

string offer = "AK47HyperBeastFieldTested";
string item = "AK47HyperBeastFieldTested";
string pattern = @"\b(" + item + @")\b";
int count = Regex.Matches(offer, pattern).Count;
Console.WriteLine(count);

有人建议使用(^|\b)(\b|$) - 这是多余的,因为\b(字边界)已经在这些位置匹配。

如果您的item可能以非单词字符开头或结尾,但仍需要整个单词匹配,请使用

string pattern = @"(?<!\w)(" + item + @")(?!\w)";

另外,请注意,如果您打算使用替换(例如\b(word|another)\b),则只需要圆括号。如果您一次只测试一个单词,则可以安全地删除它们。

答案 1 :(得分:0)

\b是您在offer中没有的字边界。而是使用

string pattern = @"^\S*(" + item + @")\S*$";