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编程......”
答案 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}}。我把它修好了。