Regex 如何改进正则表达式以捕获最后n个单词。。。步骤太多
我有下面的正则表达式来捕获1到3个最后的单词,但它需要超过2000个步骤,我做错了什么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
((?:\S+\S*){1,3})$
如果我这样做
*(^ |\s+(?:\s+\s*){1,3})$
然后我只得到最后一个单词,我在寻找1到3个单词。由于
\s*
子模式,您的正则表达式不是最佳的。当正则表达式引擎解析您的模式时,它看起来像\S+\S*\S+\S*\S+$
,并且由于*
不是所有格的(或者这里没有定义原子组),因此回溯将通过这些\S*
您可以使用原子组()或最好使模式线性化:
见
详细信息:
-1+非空白符号\S+
-0到2个序列(?:\s+\s+{0,2}
-1+空格\s+
-1+非空白\S+
-字符串结束$
由于
\s+
至少需要1个符号才能匹配,因此匹配字符串的可能方法的数量将大大少于\s*
由于\s*
子模式,您的正则表达式不是最佳的。当正则表达式引擎解析您的模式时,它看起来像\S+\S*\S+\S*\S+$
,并且由于*
不是所有格的(或者这里没有定义原子组),因此回溯将通过这些\S*
您可以使用原子组()或最好使模式线性化:
见
详细信息:
-1+非空白符号\S+
-0到2个序列(?:\s+\s+{0,2}
-1+空格\s+
-1+非空白\S+
-字符串结束$
由于
\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}$