Regex单词边界和匹配之间的距离

本文关键字:之间 距离 单词 边界 Regex | 更新日期: 2023-09-27 18:02:55

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

关键字可以包含或不包含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个额外的要求,我目前拥有的,但不太了解正则表达式知道如何实现这些

Regex单词边界和匹配之间的距离

我认为你可以使用下面的代码来解决两个问题:

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})" );

Regex将是

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

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

请参阅演示,它将排除粘贴后两个单词不匹配的情况