Java 简单正则表达式冻结应用程序

Java 简单正则表达式冻结应用程序,java,android,regex,Java,Android,Regex,我想检查文本是否包含电话号码或域。以前,我删除了所有空格。如果没有点击,应用程序将冻结。为什么? String aboutText = about.getText().toString(); String aboutTextClear = aboutText.replaceAll("\\s+", ""); Matcher phone = Patterns.PHONE.matcher(aboutTextClear); Matcher domain = Patterns.DOMAIN_NAME.ma

我想检查文本是否包含电话号码或域。以前,我删除了所有空格。如果没有点击,应用程序将冻结。为什么?

String aboutText = about.getText().toString();
String aboutTextClear = aboutText.replaceAll("\\s+", "");
Matcher phone = Patterns.PHONE.matcher(aboutTextClear);
Matcher domain = Patterns.DOMAIN_NAME.matcher(aboutTextClear);
if(phone.find() || domain.find()) {
    return;
}

对于较大的字符串值,域实际上可能需要很长时间才能匹配。在匹配之前删除空格会让事情变得更糟,因为现在潜在的域名可能会更大。。。。长序列的无空间文本将为TLD部分的负面点击创建大量回溯

<>我会考虑用一个简单的表达式把输入分成“已知”的小块,然后在较小的部分上进行匹配。这将减少回溯正则表达式中问题的范围

因此,由于电话号码regex更简单,而IPAddress更简单,我将分三个阶段进行操作,最后保留域名(如果可以,最好从表达式中去掉IP地址部分…)

当然,这假设输入文本很大,但是,执行以下操作:

Matcher phone = Patterns.PHONE.matcher(aboutText); // no space manipulation...
if (phone.find()) {
    return;
}
for (String word : aboutText.split("\\s+")) {
    Matcher ipaddress = Patterns.IP_ADDRESS.matcher(aboutText); // no space manipulation...
    if (ipaddress.find()) {
        return;
    }

    Matcher domain = Patterns.DOMAIN_NAME.matcher(aboutTextClear);
    if(domain.find()) {
        return;
    }
}    

没有电话和域名regex就没用了…@rolfl耶。。。。不。正则表达式看起来“OK”,我认为它是在
if()
之后发生的。使用您的调试程序,找出非匹配项是否真正完成了模式搜索。我认为Patterns.DOMAIN\u NAME有问题。如果我只对Patterns.PHONE或Patterns.PHONE和Patterns.EMAIL\u地址使用相同的代码,则不会出现崩溃。不幸的是,也没有例外,应用程序只是freez,有时甚至是整个操作系统。