我有以下正则表达式来捕获1到3个最后一个单词,但它需要超过2000个步骤,我做错了什么?
((?:\S+\s*){1,3})$
如果我这样做
.*(^|\s+)((?:\S+\s*){1,3})$
然后我只得到最后一个字,我正在寻找1到3个单词。
答案 0 :(得分:0)
由于\s*
子模式,您的正则表达式不是最佳的。当您的模式由正则表达式引擎解析时,它看起来像\S+\s*\S+\s*\S+$
,并且由于*
不具有占有性(或者此处未定义原子组),因此回溯将通过这些{{1} }。
您可以使用原子组(((?>\S+\s*){1,3})$
),或者最好使模式线性:
\s*
请参阅regex demo
<强>详情:
\S+(?:\s+\S+){0,2}$
- 1个非空白符号\S+
- 0到2个序列
(?:\s+\S+){0,2}
- 1+空格\s+
- 1 +非空格\S+
- 字符串结束。由于$
要求至少匹配1个符号,因此匹配字符串的可能方式数量将少于\s+
。