繁体   English   中英

正则表达式vs字符串包含

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM