我必须找到以空格分隔的单词。最小的回溯是什么最佳做法?
我找到了这个解决方案:
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。
答案 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步。 在“句子”句子后,您可能会遇到标点符号问题。做一些测试。
我希望我有所帮助。