0

我写了下面的正则表达式,所以这个正则表达式不会与输入匹配;它正在工作,但循环运行无限时间。如何解决问题

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");
}
4

2 回答 2

4

Java 的.find()方法返回“当且仅当输入序列的子序列与此匹配器的模式匹配时为真” -请参阅文档。在您的代码中,如果未找到匹配项,则:

while (!matcher.find()) {
    System.out.println("Good Job");
}

评估为:

while (!false) {
    System.out.println("Good Job");
}

或者,更简单:

while (true) {
    System.out.println("Good Job");
}

因此,您的无限循环。

于 2013-08-26T11:02:58.520 回答
2

从 javadocsMatcher.find()

尝试查找与模式匹配的输入序列的下一个子序列。

此方法在此匹配器区域的开头开始,或者,如果该方法的先前调用成功并且匹配器此后尚未重置,则从前一个匹配不匹配的第一个字符开始。

如果匹配成功,则可以通过 start、end 和 group 方法获取更多信息。

返回: true 当且仅当输入序列的子序列与此匹配器的模式匹配

你应该理想地使用

while(matcher.find())

上面将尝试根据正则表达式模式连续匹配输入字符串。

如果找不到模式,或者如果找到匹配项,您的 while 循环将进入无限循环,无论哪种方式都没有用

while(!matcher.find())

但是,如果您想检查它是否不匹配,那么您可以使用if

if(!matcher.find()){
   //No Matches
} else {
   //Atleast one Match
} 

还有一个提示。如果您尝试解析 XML,Regex 可能不是合适的候选者。尝试使用许多可用的 XML 解析器之一。

于 2013-08-26T11:06:57.633 回答