Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正则词边界和匹配之间的距离_C#_.net_Regex - Fatal编程技术网

C# 正则词边界和匹配之间的距离

C# 正则词边界和匹配之间的距离,c#,.net,regex,C#,.net,Regex,我希望能够使用正则表达式在某些文本中查找特定关键字短语的任何匹配项 关键词可能包含也可能不包含一个或多个空格(通常只有一个单词,但在某些情况下可能是多个单词) 我目前正在使用以下表达式,其中关键字短语是单个单词(不包含空格): 当关键字短语为多个单词(包含一个或多个空格)时,我将更新表达式以用通配符替换其中任何空格: regexPattern = regexPattern.Replace( " ", ".*" ); 有两种情况下,这不是我所需要的 1) 如果长文本中的关键字短语(我正在搜索匹配

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

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

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

当关键字短语为多个单词(包含一个或多个空格)时,我将更新表达式以用通配符替换其中任何空格:

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


因此,我基本上对我目前拥有的东西有两个额外的要求,但我对正则表达式的了解还不足以了解如何实现这些要求。

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

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

var regexpatern=string.Format((?第二个问题很容易用限制量词
{1,5}
(除换行符外,任何字符最多出现1到5次)。但是如果单词边界阻止匹配关键字,只需删除单词边界,或使用“知道”的智能方法即可“在何处添加它们,在何处不添加它们。如果您只想让它们在数字和
\uuuu
之间匹配,您可能需要检查
string.Format(“(?完美,您提供的第一个示例似乎完全符合我的需要。感谢您提供了如此完整的答案和演示!为了完整性,我发现我需要摆脱大括号的限制。”{五十} 在string.Format行中,它出错了,所以它变成了:var regexpatern=string.Format((?我认为在这种情况下字符串连接更好,因为我们避免了转义
{/code>和
}
。顺便说一句,
(?=\P{L}}$)
相当于
(?!\P{L})
最初,我有
(?!\P{L}>)
,但我希望模式更加明确。
I have a bike for _.,1sale. I've also got a laptop for sale!
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}|$)