正则表达式查找用空格分隔的单词,回溯

时间:2015-10-19 12:50:13

标签: java regex backtracking

我必须找到以空格分隔的单词。最小的回溯是什么最佳做法?

我找到了这个解决方案:

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。

3 个答案:

答案 0 :(得分:0)

您可以尝试将String拆分为String数组,然后在消除数组中与单词定义不匹配的任何成员(例如空格或者空格)之后找到数组的大小

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循环遍历split String数组并检查以确保每个数组成员包含一个单词(至少一次字符或数字)并将其添加到总字数中。

答案 1 :(得分:0)

你想要找到以var validIpAddressRegex : String = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" let regex = try! NSRegularExpression(pattern : validIpAddressRegex, options: NSRegularExpressionOptions.CaseInsensitive) let abc = NSString(data: myData, encoding: NSUTF8StringEncoding) let xyz = abc as! String let newString = xyz.stringByReplacingOccurrencesOfString("\n", withString: " ", options: NSStringCompareOptions.LiteralSearch, range: nil) let results = regex.matchesInString(newString, options: [], range: NSMakeRange(0, abc!.length)) as! [NSTextCheckingResult] print(results) 分隔的单词。所以你应该至少说space。你可以使用它而不需要37步。

1 or more space

参见演示。

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

对于java double escape all \d+\s([a-zA-Z]+\s+)+in a sentence

答案 2 :(得分:0)

如果我理解正确,你想要匹配空格分隔的任何单词加上“在句子中”的句子。

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

(in a sentence)|(\S+)

如regex101上的示例所示:Exemple

正则表达式匹配61步。 在“句子”句子后,您可能会遇到标点符号问题。做一些测试。

我希望我有所帮助。