我搜索了一些问题,但找不到我要找的确切答案。 我需要搜索大量的文本字符串以查找关键字匹配项。我正在使用IndexOf,但是,我需要找到完整的单词匹配,例如如果我搜索Java,但文本包含JavaScript,则不应该匹配。这可以使用 \ b { pattern } \ b 正常工作,但是如果我搜索类似C#的内容,那么它就不起作用。
以下是我正在搜索的文本字符串的几个示例:
languages include Java,JavaScript,MySql,C#
languages include Java/JavaScript/MySql/C#
languages include Java, JavaScript, MySql, C#
显然,问题在于特殊字符'#';所以这在搜索C ++时也不起作用。
答案 0 :(得分:2)
使用Regex.Escape
转义模式,并使用\b
/ (?<!\w)
外观替换依赖于上下文的 (?!\w)
字边界:
var rx = $@"(?<!\w){Regex.Escape(pattern)}(?!\w)";
如果在当前位置之前有一个字符串的开头或非单词字符,那么(?<!\w)
是一个负面的后观,它会使匹配失败,而(?!\w)
是一个负面的looahead,使得匹配失败如果在当前位置之后有一个字符串的结尾或一个非字的字符。
答案 1 :(得分:1)
是的,这是因为\b
之后没有字边界(#
),因为#
不是&#39; ta&#34;字&#34 ;字符。您可以使用如下所示的正则表达式,该正则表达式搜索的语言不是语言后面的语言名称[^a-zA-Z+#]
的一部分:
\b{pattern}[^a-zA-Z+#]
或者,如果您认为可以列出不属于某个语言名称的所有可能字符(例如,空格,,
,.
和{{1} }):
;
或者,如果语言名称可能位于字符串的最后(取决于您从中获取数据),您可能还需要匹配字符串{{1除了分隔符之外,或类似地,字符串[\s,.;]{pattern}[\s,.;]
的开头。
$