正则表达式字边界和匹配之间的距离

时间:2015-07-16 09:09:47

标签: c# .net regex

我希望能够使用正则表达式查找某些文本中特定关键短语的任何匹配项。

关键短语可能包含也可能不包含1个或多个空格(通常只有1个单词,但在某些情况下可能包含多个单词)。

我目前正在使用以下表达式,其中关键短语是单个单词(不包含空格):

var regexPattern = string.Format( "\\b({0})\\b", keyphrase );

当关键短语是多个单词(包含一个或多个空格)时,我正在更新表达式,用通配符替换任何这些空格:

regexPattern = regexPattern.Replace( " ", ".*" );

有几种情况,这种情况并不像我需要的那样。

1)如果我的长文本中的关键短语(我搜索匹配项)被下划线或数字包围,则它不再匹配。连字符,逗号,句号等都很好。在这些情况下,它仍会检测到那里的关键短语,但是当关键短语被下划线或数字包围时,我也需要它来匹配。

2)在我的关键短语由多个单词组成(包含1个或多个空格)的场景中,我希望在形成我的关键短语的每个单词之间允许最多一定的最大距离/长度。

e.g。如果我的密码短语是:

for sale

...我正在匹配的文字是

I have a bike for    sale.

...(关键短语之间的最大距离为5个字符),我希望正则表达式匹配:

bike for    sale

但是,如果关键短语之间的距离超过5个字符,我不希望它匹配。

此外,此距离'不应该局限于关键短语之间出现的空格数量,因为我也希望以下匹配例如:

I have a bike for _.,1sale.

最后,可能值得说明的是,在某些情况下,我搜索的关键短语可能不止一次出现,而且在满足上述条件的情况下,我需要两者都是匹配:

e.g。

I have a bike for _.,1sale. I've also got a laptop for sale!

所以,我对我目前拥有的内容基本上有两个额外的要求,但是不能很好地了解正则表达式以了解我如何实现它们。

1 个答案:

答案 0 :(得分:2)

我认为您可以使用以下代码解决2个问题:

var regexPattern = string.Format( "(?<!\\p{{L}}){0}(?!\\p{{L}})", keyphrase );
// or
// var regexPattern = string.Format( "(?<=\\P{{L}}|^){0}(?=\\P{{L}}|$)", keyphrase );
regexPattern = regexPattern.Replace( " ", ".{0,5}" );

正则表达式看起来像

(?<!\p{L})key.{0,5}word(?!\p{L})

(?<=\P{L}|^)key.{0,5}word(?=\P{L}|$)

以下是demo 1 / demo 2

请注意,如果您想以相同的方式匹配内部词边界,请使用

regexPattern = regexPattern.Replace( " ", "(?=\\P{L}).{0,5}(?<=\\P{L})" );

正则表达式

(?<!\p{L})key(?=\P{L}).{0,5}(?<=\P{L})word(?!\p{L})

(?<=\P{L}|^)key(?=\P{L}).{0,5}(?<=\P{L})word(?=\P{L}|$)

请参阅demo,它会排除胶合后2个单词不匹配的情况。