Regex 如何改进正则表达式以捕获最后n个单词。。。步骤太多

Regex 如何改进正则表达式以捕获最后n个单词。。。步骤太多,regex,Regex,我有下面的正则表达式来捕获1到3个最后的单词,但它需要超过2000个步骤,我做错了什么 ((?:\S+\S*){1,3})$ 如果我这样做 *(^ |\s+(?:\s+\s*){1,3})$ 然后我只得到最后一个单词,我在寻找1到3个单词。由于\s*子模式,您的正则表达式不是最佳的。当正则表达式引擎解析您的模式时,它看起来像\S+\S*\S+\S*\S+$,并且由于*不是所有格的(或者这里没有定义原子组),因此回溯将通过这些\S* 您可以使用原子组()或最好使模式线性化: 见 详细信息: \S

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

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

如果我这样做

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


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

由于
\s*
子模式,您的正则表达式不是最佳的。当正则表达式引擎解析您的模式时,它看起来像
\S+\S*\S+\S*\S+$
,并且由于
*
不是所有格的(或者这里没有定义原子组),因此回溯将通过这些
\S*

您可以使用原子组()或最好使模式线性化:

详细信息

  • \S+
    -1+非空白符号
  • (?:\s+\s+{0,2}
    -0到2个序列
    • \s+
      -1+空格
    • \S+
      -1+非空白
  • $
    -字符串结束

由于
\s+
至少需要1个符号才能匹配,因此匹配字符串的可能方法的数量将大大少于
\s*

由于
\s*
子模式,您的正则表达式不是最佳的。当正则表达式引擎解析您的模式时,它看起来像
\S+\S*\S+\S*\S+$
,并且由于
*
不是所有格的(或者这里没有定义原子组),因此回溯将通过这些
\S*

您可以使用原子组()或最好使模式线性化:

详细信息

  • \S+
    -1+非空白符号
  • (?:\s+\s+{0,2}
    -0到2个序列
    • \s+
      -1+空格
    • \S+
      -1+非空白
  • $
    -字符串结束

由于
\s+
至少需要1个符号来匹配,因此匹配字符串的可能方法的数量将大大少于
\s*

非常感谢这一点,我不明白为什么它的{0,2}而不是{1,3}请参见,
\s+
开头匹配的是1+符号,而不是空格。所以,它已经是一个单词了。因此,您只需要0个、1个或2个以上的非空白块,这些非空白块用1+空白块分隔。因此,
{0,2}
限制量词是必需的。非常感谢这一点,我不明白为什么它的{0,2}而不是{1,3}。请看,
\S+
开头匹配的是1+符号,而不是空格。所以,它已经是一个单词了。因此,您只需要0个、1个或2个以上的非空白块,这些非空白块用1+空白块分隔。因此,
{0,2}
限制量词是必需的。
\S+(?:\s+\S+){0,2}$