如何提高正则表达式以捕获最后n个单词...太多步骤

时间:2017-02-17 09:01:18

标签: regex

我有以下正则表达式来捕获1到3个最后一个单词,但它需要超过2000个步骤,我做错了什么?

((?:\S+\s*){1,3})$

如果我这样做

.*(^|\s+)((?:\S+\s*){1,3})$

然后我只得到最后一个字,我正在寻找1到3个单词。

1 个答案:

答案 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+