【发布时间】:2016-01-17 19:50:24
【问题描述】:
我必须找到以空格分隔的单词。使用最小回溯的最佳做法是什么?
我找到了这个解决方案:
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 中的常量单词进行检查。
但在这种情况下,regex101.com 给了我 4156 步的调试,这是灾难性回溯。有什么办法可以避免吗?
我还有其他更复杂的示例,它需要 86000 步并且无法验证。
主要问题,我必须找到所有由空格分隔的单词,但同时正则表达式包含由空格分隔的单词(常量)。这就是我有灾难性回溯的地方。
我必须使用 Java 来做到这一点。
【问题讨论】:
-
您可以将
[a-zA-Z]替换为\w来表示所有非空白字符,不是吗? -
我不知道我是否误解了你的问题,但你不能简单地使用
String.split()吗? -
如果您根据空格/点/空白分割字符串并从那里开始会有帮助吗?
-
尝试使用所有格量词和
[a-zA-Z]++。 -
这个表达式
"\\d+\s[a-zA-Z\\s]+ in a sentence"matches in 34 steps。不幸的是,它允许连续有多个空格。
标签: java regex backtracking