正则表达式vs String.Contains

时间:2011-02-18 19:19:39

标签: c# .net regex

HOLA。我没有编写一个方法来测试纯文本或html文档中的单词。我用正则表达式合理识字,而且我对c#更新(来自更多java)。

只是因为,

string html = source.ToLower();
string plaintext = Regex.Replace(html, @"<(.|\n)*?>", " "); // remove tags
plaintext = Regex.Replace(plaintext, @"\s+", " "); // remove excess white space

然后,

string tag = "c++";
bool foundAsRegex = Regex.IsMatch(plaintext,@"\b" + Regex.Escape(tag) + @"\b");
bool foundAsContains = plaintext.Contains(tag);

对于应该找到“c ++”的情况,有时发现AsRegex是真的,有时是假的。我的google-fu很弱,所以我没有太多回到“什么鬼”。任何想法或指示欢迎!

编辑:

我正在搜索简历中的技能匹配。例如,不同的值“c ++”。

编辑:

下面给出了一个真正的摘录:

“......管理 - c,c ++,perl,shell编程......”

2 个答案:

答案 0 :(得分:4)

问题是\b匹配单词字符和非单词字符。鉴于表达式\bc\+\+\b,您遇到了问题。 “+”是非单词字符。因此,在“xxx c ++,xxx”中搜索模式,你不会找到任何东西。 “+”字符后面没有“单词中断”。

如果您正在寻找非单词字符,那么您将不得不改变您的逻辑。不确定最好的是什么。我想你可以使用\W,但是它不会在行的开头或结尾匹配,所以你需要(^|\W)(\W|$) ......这很难看。而且速度很慢,但可能仍然足够快,具体取决于您的需求。

答案 1 :(得分:1)

你的正则表达式变成了:

/\bc\+\+\b/

这意味着您正在寻找单词边界,后跟字符串c++,后跟另一个单词边界。这意味着它与abc++之类的字符串不匹配,而plaintext.Contains将成功。

如果您可以举例说明正则表达式在您预期成功时失败的地方,那么我们可以给您更明确的答案。

修改:我的原始正则表达式为/\bc++\b/,这是不正确的,因为c++正在传递给Regex.Escape(),它会转出正则表达式元字符,例如{ {1}}。我把它修好了。