我写了下面的正则表达式,这个正则表达式与输入不匹配;它正在工作,但循环运行无限时间。如何解决问题
String originalRegex ="(?s)\\00|\\+ADw-|\\+AD4-|%[0-9a-f]{2}|System[.][a-z]|javascript\\s*:|>(?:\".*|^'.*|[^a-z]'.*|'[^a-z].*|')[-+\\*/%=&|^~\"']|\\?.*<:|\\(\\s*[a-z]{2,}\\.[a-z]{2,}.*\\)";
String xmlData = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><configuration xmlns=\"http://www.example.com/api/2.2\" timestamp=\"str111\" version=\"2.2\"><domain account=\"4af17966-c841-4b97-a94a-edd7a0769\" /></configuration>";
String freetext = ">(?:\".*|^'.*|[^a-z]'.*|'[^a-z].*|')[-+\\*/%=&|^~\"']|\\?.*<:";
final Pattern PATTERN_1 = Pattern.compile(freetext);
Matcher matcher = PATTERN_1.matcher(xmlData);
while (!matcher.find()) {
System.out.println("Good Job");
}
答案 0 :(得分:4)
如果且仅当输入序列的子序列与此匹配器的模式“ - see the documentation匹配时,Java的.find()
方法返回” true。在您的代码中,如果未找到匹配项,则:
while (!matcher.find()) {
System.out.println("Good Job");
}
评估为:
while (!false) {
System.out.println("Good Job");
}
或者,甚至更简单:
while (true) {
System.out.println("Good Job");
}
因此,你的无限循环。
答案 1 :(得分:2)
来自Matcher.find()
尝试查找输入序列的下一个子序列 匹配模式。
此方法从此匹配器区域的开头开始,或者,如果是 以前的方法调用是成功的,匹配器有 从没有重置,在第一个字符不匹配 上一场比赛。
如果匹配成功,则可以通过获得更多信息 开始,结束和分组方法。
返回:当且仅当输入序列的子序列时才返回true 匹配此匹配器的模式
你应该理想地使用
while(matcher.find())
以上将尝试根据正则表达式模式连续匹配输入字符串。
如果无法找到模式,你的while循环将进入无限循环,或者如果找到匹配,它将退出循环,无论哪种方式都没用
while(!matcher.find())
但是,如果要检查它是否不匹配,则可以使用if
if(!matcher.find()){
//No Matches
} else {
//Atleast one Match
}
还有一个提示。如果您正在尝试解析XML,则Regex可能不是正确的候选者。尝试使用许多可用的XML解析器之一。