正则表达式超时到多少 -

时间:2018-02-08 09:00:06

标签: c# regex

这高于我的正则表达式知识水平。我之前没有使用正则表达式那么多,但这是我第一次遇到正则表达式超时。

我要做的是在Instagram帖子之前和之后找到匹配的单词+3个单词+ 3个单词。如你所知,一些Instagram帖子太奇怪了。

这是(截断的)Instagram帖子:

 ⏬⏬
WA ☎ :  --------------------------------------------------------------------
---------------------

----------------------------------------------------------------------------
-------------
  
------------------------------------------------------------
#paytrenustyusufmansur
#bisnisberkah
#fintech
#MUI
#bisnissyariah
#PokokNyaPAYTRENinAJA
#PaytrenAcademy

这是我的正则表达式:

\s*([a-zA-Z0-9åäöÅÄÖ_\-]+\W+){0,3}(\bPokokNyaPAYTRENinAJA(?![^.,!?\s]))(\W+[a-zA-Z0-9åäöÅÄÖ_\-]+){0,3}\s*

在这里,我正在尝试匹配单词"PokokNyaPAYTRENinAJA",如果我删除所有"-"个字符,该工作正常,但不知何故,正则表达式无法处理所有"-"和它超时

1 个答案:

答案 0 :(得分:1)

问题是由于放置在量化组中的两个后续子模式。 ([a-zA-Z0-9åäöÅÄÖ_-]+\W+){0,3}部分重复0到3次,[a-zA-Z0-9åäöÅÄÖ_-]+\W+都可以匹配-(非单词字符)。由于正则表达式引擎尝试使用回溯来匹配文本的所有可能方法,因此在这种情况下步骤数会变得很大。

解决方案是从-中减去\W

您可以使用

\s*([a-zA-Z0-9åäöÅÄÖ_-]+[^\w-]+){0,3}(PokokNyaPAYTRENinAJA(?![^.,!?\s]))([^\w-]+[a-zA-Z0-9åäöÅÄÖ_-]+){0,3}\s*

或者,.NET风格:

\s*([a-zA-Z0-9åäöÅÄÖ_-]+[\W-[-]]+){0,3}(PokokNyaPAYTRENinAJA(?![^.,!?\s]))([\W-[-]]+[a-zA-Z0-9åäöÅÄÖ_-]+){0,3}\s*

[\W-[-]]是一个包含character class subtraction的字符类,其中\W匹配任何非字母字符-

请参阅regex demo