这高于我的正则表达式知识水平。我之前没有使用正则表达式那么多,但这是我第一次遇到正则表达式超时。
我要做的是在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"
,如果我删除所有"-"
个字符,该工作正常,但不知何故,正则表达式无法处理所有"-"
和它超时
答案 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。