关于java:匹配正则表达式时,程序将永远运行

Program run forever when matching regex

我不知道为什么,但是当我尝试运行该程序时,看起来该程序将永远运行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package fjr.test;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test3 {

    public static void main(String[] args){

        String regex ="dssdfsdfdsf wdasdads dadlkn mdsds .";

        Pattern p  = Pattern.compile("^([a-zA-Z]+ *)+$");

        Matcher match =  p.matcher(regex);

        if(match.matches()){
            System.out.println("Yess");
        }else{
            System.out.println("No..");
        }

        System.out.println("FINISH...");
    }

}

我需要做的是匹配包含一堆只用空格隔开的单词的模式


n


这确实会终止,但是大约需要10秒钟。一些观察:

  • 从测试字符串的末尾删除句号可以使其速度更快。
  • 将正则表达式中的*更改为(我相信实际上是您想要的)*使其速度更快。我认为该位置具有0个字符的选项会大大扩展状态空间。
    我会使用:

    ^(\\\\ w)* \\\\ w $"

表示一堆(单词空间),后跟一个单词。反对你的例子,它很快


您可以使用此正则表达式将所有单词都匹配为空格或不匹配。

样本:

1
 Pattern p  = Pattern.compile("([a-zA-Z ]+)");


有趣的现象。这与贪婪量词的行为有关