2017-07-12 205 views
2

我已经搜索了一些问题,但找不到确切的答案,我正在寻找。 我有要求搜索大字符串文本寻找关键字匹配。我使用IndexOf,但是,我需要找到整个单词匹配例如如果我搜索Java,但文本包含JavaScript,则它不应该匹配。这工作正常使用\ b {模式} \ b,但如果我搜索类似C#的东西,那么它不起作用。C#正则表达式全字匹配,带特殊字符

下面是我通过搜索文本字符串的几个例子:

languages include Java,JavaScript,MySql,C# 
languages include Java/JavaScript/MySql/C# 
languages include Java, JavaScript, MySql, C# 

显然,问题出在特殊字符“#”;所以这在搜索C++时也不起作用。

+0

你是否知道术语之间的所有可能的分隔符? – GigiSan

+0

不,因为我正在搜索的文字被从互联网上删除。这将是正常的逻辑词边界,例如空格,逗号等 – percentum

+0

我会用空格替换所有逗号和斜线(以及其他分隔符*)。然后删除所有重复的空格,然后在开头和结尾添加一个。然后只需搜索'“”+ word +“”'。 – GigiSan

回答

2

使用Regex.Escape逃离图案和与(?<!\w)/(?!\w) lookarounds更换依赖于上下文的\b字边界:

var rx = [email protected]"(?<!\w){Regex.Escape(pattern)}(?!\w)"; 

(?<!\w)是负反向预搜索失败的匹配,如果有一个在当前位置之前立即开始字符串或非单词字符,并且(?!\w)是一个否定looahead,如果字符串结尾或非字词字符立即结束,则匹配失败目前的位置。

+1

欢呼声看起来像这样做 – percentum

1

是的,这是因为在#之后没有字边界(\b),因为#不是“字”字符。你可以使用正则表达式像下面这样,其搜索的字符不是一个语言名称[^a-zA-Z+#]的语言后,部分:

\b{pattern}[^a-zA-Z+#] 

或者,如果你相信你可以列出所有可能的字符不属于的语言名称的一部分(例如,空格,.;):

[\s,.;]{pattern}[\s,.;] 

替换地,如果有可能的是一个语言的名字是在一个字符串的末尾(取决于你从中得到的数据),你可能也需要匹配结束字符串$除了分隔符之外,或者类似地,字符串^的开头。

[\s,.;]{pattern}(?:[\s,.;]|$) 
相关问题