[英]Regex vs String.Contains
你好。 我无法编写一种方法来测试纯文本或html文档中的单词。 我对regex相当了解,并且对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 ++”的情况,有时foundAsRegex为true,有时为false。 我的google-fu很弱,所以我对“到底是什么”的了解不多。 任何想法或指针欢迎!
编辑:
我正在寻找简历技能方面的比赛。 例如,不同的值“ c ++”。
编辑:
真实的摘录如下:
“ ...管理-c,c ++,perl,shell编程...”
问题是\\b
在单词字符和非单词字符之间匹配。 给定表达式\\bc\\+\\+\\b
,您有问题。 “ +”是非单词字符。 因此,在“ xxx c ++,xxx”中搜索模式,您将不会找到任何东西。 “ +”字符后没有“分词”。
如果您要查找非单词字符,则必须更改逻辑。 不知道最好的东西是什么。 我想您可以使用\\W
,但是它不会在行的开头或结尾匹配,因此您需要(^|\\W)
和(\\W|$)
...这很丑。 并且缓慢,尽管根据您的需求也许仍然足够快。
您的正则表达式将变为:
/\bc\+\+\b/
这意味着您要查找一个单词边界,然后是字符串c++
,然后是另一个单词边界。 这意味着它将与abc++
类的字符串不匹配,而plaintext.Contains
将成功。
如果您可以举例说明您的正则表达式在您期望成功的地方失败,那么我们可以为您提供更明确的答案。
编辑:我原来的正则表达式是/\\bc++\\b/
,这是不正确的,因为将c++
传递给Regex.Escape()
,它转义了正则表达式元字符,例如+
。 我已经在上面修复了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.