【发布时间】:2015-07-16 09:09:46
【问题描述】:
我希望能够使用正则表达式来查找某些文本中特定关键词的任何匹配项。
关键词可能包含也可能不包含 1 个或多个空格(通常只有 1 个单词,但在某些情况下可能包含多个单词)。
我目前正在使用以下表达式,其中关键字是单个单词(不包含空格):
var regexPattern = string.Format( "\\b({0})\\b", keyphrase );
当关键字是多个单词(包含一个或多个空格)时,我会更新表达式以用通配符替换其中的任何空格:
regexPattern = regexPattern.Replace( " ", ".*" );
在某些情况下,它的行为并不符合我的需要。
1) 如果我的长文本(我正在搜索的匹配项)中的关键词被下划线或数字包围,则它不再匹配。连字符、逗号、句号等都可以。在这些情况下,它仍然可以检测到其中的关键词,但是当关键词被下划线或数字包围时,我还需要它来匹配。
2) 在我的关键词包含多个单词(包含 1 个或多个空格)的情况下,我希望在构成我的关键词的每个单词之间允许最大距离/长度。
例如如果我的关键词是:
for sale
... 我匹配的文本是
I have a bike for sale.
...(关键字词之间的最大距离为 5 个字符),我希望正则表达式匹配:
bike for sale
但是,如果关键字词之间的距离超过 5 个字符,我不希望它匹配。
此外,这个“距离”不应局限于关键字词之间出现的空格数,因为我还希望匹配以下内容,例如:
I have a bike for _.,1sale.
最后,值得一提的是,在某些情况下,我正在搜索的关键词可能出现不止一次,并且在满足上述条件的情况下,我需要同时匹配两者:
例如
I have a bike for _.,1sale. I've also got a laptop for sale!
因此,我基本上对我目前拥有的内容还有 2 个额外的要求,但我对正则表达式的了解不够深入,无法知道如何实现这些。
【问题讨论】:
-
第二个问题很容易通过限制量词
.{1,5}解决(除了换行符之外的任何字符出现 1 到 5 次)。但是,如果单词边界阻止匹配关键字,只需删除单词边界,或者使用一种智能方法“知道”在哪里添加它们,在哪里不添加。如果您只想让它在数字和_之间匹配,您可能需要检查string.Format( "(?<=\\P{L}|^)({0})(?=\\P{L}|$)", keyphrase )