C# Regex vs String.Contains

C# Regex vs String.Contains,c#,.net,regex,C#,.net,Regex,你好。我无法编写一个方法来测试纯文本或html文档中的单词。我对正则表达式相当精通,而我对c#(来自java)比较新 只是因为 string html = source.ToLower(); string plaintext = Regex.Replace(html, @"<(.|\n)*?>", " "); // remove tags plaintext = Regex.Replace(plaintext, @"\s+", " "); // remove excess white

你好。我无法编写一个方法来测试纯文本或html文档中的单词。我对正则表达式相当精通,而我对c#(来自java)比较新

只是因为

string html = source.ToLower();
string plaintext = Regex.Replace(html, @"<(.|\n)*?>", " "); // remove tags
plaintext = Regex.Replace(plaintext, @"\s+", " "); // remove excess white space
对于应该找到“c++”的情况,foundAsRegex有时为true,有时为false。我的google fu很弱,所以我没有在“见鬼去吧”上得到多少回复。欢迎有任何想法或建议

编辑:

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

编辑:

下面是一个真实的摘录:


……管理-C,C++,perl,shell编程……

你的正则表达式变成:

/\bc\+\+\b/
这意味着您要查找一个单词边界,后面是字符串
c++
,后面是另一个单词边界。这意味着它不会匹配像
abc++
这样的字符串,而
纯文本.Contains
将成功

如果你能给我们举个例子,说明你的正则表达式在你期望它成功的时候失败了,那么我们可以给你一个更明确的答案


Edit:我原来的正则表达式是
/\bc++\b/
,这是不正确的,因为
c++
被传递到
regex.Escape()
,它会转义出像
+
这样的正则表达式元字符。我已经在上面修复了它。

问题是
\b
在单词字符和非单词字符之间匹配。给定表达式
\bc\++\b
,您就有问题了。“+”是非单词字符。因此,在“XXX C++,XXX”中搜索模式,你什么也找不到。在“+”字符后面没有“分词”


如果您正在寻找非单词字符,那么您必须更改逻辑。不知道最好的事情是什么。我想您可以使用
\W
,但是它在行首或行尾都不匹配,因此您需要
(^ |\W)
(\W |$)
。。。这很难看。速度也很慢,不过根据您的需要,速度可能还不够快。

@CanSpice,我也在尝试编辑格式……您比我快。我也添加了.net标记。也许可以看看用于解析Html文档的Html敏捷包-你们这些孩子在这里很敏捷,谢谢。有时用户会给我糟糕的html,有时是纯文本,所以html标记是次要的。
Regex.Escape
会不会把它变成
\bc\+\b
?@Daniel:你在我编辑答案时留下了那条评论。:-)@canspice。这正是我想要的,但它没有达到我的预期。如果“C++”是中间流——例如“java,语法差,坏点头,C++,其他一些HOHA”——它可能会找到它,但它可能不是。这就是我的断点告诉我的,是的,它们确实如此。@后进生:请给出匹配和不匹配字符串的确切示例。@canspice,我刚刚编辑了正文。“c++”匹配字符串。包含但不包含具有正确转义的正则表达式。它的行为也与“c#”和更普通的文本(如“perl”)不一致。啊!我想这就是对“c#”的类似反应的原因;然而,我想我也有不合适的匹配只针对字母数字的单词。我正在检查。如果不是这样,我肯定会结束这个问题。就这样。这是糟糕的正则表达式,仅此而已。好吧,有坏的用户文本,但是regex不能对坏用户做任何事情。谢谢你的帮助和观点!
/\bc\+\+\b/