正则表达式查找以 space 分隔的单词,回溯

Regular Expression to find words separated with space, backtracking

我必须找到由 space 分隔的单词。用最小的回溯来做到这一点的最佳实践是什么?

我找到了这个解决方案:

Regex: \d+\s([a-zA-Z]+\s{0,1}){1,} in a sentence
Input: 1234 this is words in a sentence

所以,this is words - 我必须使用正则表达式 ([a-zA-Z]+\s{0,1}){1,} 和单词 in a sentence 进行检查 我必须使用正则表达式 in a sentences.[=16= 中的常量单词进行检查]

但在这种情况下 regex101.com 给了我 4156 个步骤的调试,这就是灾难性回溯。有什么办法可以避免吗?

我还有其他更复杂的例子,它需要 86000 步并且没有验证。

主要问题,我必须找到所有由 space 分隔的单词,但同时正则表达式包含由 space(常量)分隔的单词。这是我进行灾难性回溯的地方。

我必须使用 Java 来做到这一点。

您可以尝试将字符串拆分为一个字符串数组,然后在删除数组中与您的单词定义不匹配的任何成员(例如空格或标点符号)后找出数组的大小

String[] mySplitString = myOriginalString.split(" ");
for(int x = 0; x < mySplitString.length; x++){
    if(mySplitString[x].matches("\w.*"/*Your regex for a word here*/)) words++;
}

mySplitString 是一个从原始字符串中拆分出来的字符串数组。删除所有空白字符,并将空白字符之前、之后或之间的子字符串放入新的 String 数组中。 for 循环遍历拆分字符串数组并检查以确保每个数组成员都包含一个单词(字符或数字至少一次)并将其添加到总单词数中。

您想查找由 space 分隔的单词。因此您至少应该说 1 or more space。您可以使用它来代替它,只需 37 个步骤。

\d+\s([a-zA-Z]+\s+)+in a sentence

查看演示。

https://regex101.com/r/tD0dU9/4

对于java双转义全部即\d==\d

如果我没理解错的话,你想要匹配由 space 分隔的任何单词加上句子 "in a sentence".

您可以尝试以下解决方案:

(in a sentence)|(\S+)

正如在 regex101 上的这个例子中所见:Exemple

正则表达式匹配 61 步。 "in a sentence" 句子后的标点可能有问题。做一些测试。

希望对您有所帮助。