我希望能够使用正则表达式来查找某些文本中特定关键短语的任何匹配项.
关键短语可能包含也可能不包含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个问题:
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}|$)
请注意,如果您想以相同的方式匹配内部单词边界,请使用
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个单词不匹配的情况.