首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex检查运行无限时间

Regex检查运行无限时间
EN

Stack Overflow用户
提问于 2013-08-26 10:55:15
回答 2查看 164关注 0票数 0

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

代码语言:javascript
复制
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");
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-26 11:02:58

Java的.find()方法返回“当且仅当输入序列的子序列与匹配器的模式匹配”-- 见文件。在您的代码中,如果没有找到匹配项,则:

代码语言:javascript
复制
while (!matcher.find()) {
    System.out.println("Good Job");
}

评价为:

代码语言:javascript
复制
while (!false) {
    System.out.println("Good Job");
}

或者,甚至更简单:

代码语言:javascript
复制
while (true) {
    System.out.println("Good Job");
}

因此,你的无限循环。

票数 4
EN

Stack Overflow用户

发布于 2013-08-26 11:06:57

来自Matcher.find()的javadocs

尝试查找与模式匹配的输入序列的下一个子序列。 此方法从该匹配器区域的开头开始,或者,如果以前调用该方法成功,并且匹配器此后未被重置,则在第一个字符上不匹配上一次匹配。 如果匹配成功,则可以通过开始、结束和组方法获得更多信息。 返回:当且仅当输入序列的子序列与匹配程序的模式匹配

理想情况下,你应该使用

代码语言:javascript
复制
while(matcher.find())

以上将尝试在regex模式的基础上连续匹配输入字符串。

如果您的while循环无法找到模式,它将进入无限循环,或者如果找到匹配,它将退出循环,无论是哪种方式,它都没有用。

代码语言:javascript
复制
while(!matcher.find())

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

代码语言:javascript
复制
if(!matcher.find()){
   //No Matches
} else {
   //Atleast one Match
} 

再给点小费。如果您试图解析XML,Regex可能不是正确的候选对象。尝试使用许多可用的XML解析器之一。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18442437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档