Java正则表达式:无法提取单词短语

时间:2012-07-24 18:58:04

标签: java regex matching

我正在尝试从Java源文件中提取单词短语。例如,我有一个简单的源类

class TestClass implements TestInterface implements TestInterface2 {

}

class TestClass2 {

}

我想提取“class TestClass”和“class TestClass2”。我尝试了不同的正则表达式模式,但找不到解决方案

我的测试代码spinet: -

public static void wordPhraser(String sourceText) {

    Pattern p = Pattern.compile("class(\\s+)([a-zA-Z]*)");
    Matcher m = p.matcher(sourceText);
    while (m.find()) {
        System.out.println("output " + m.group());
    }
}

也尝试过: -

"class\\s*([a-zA-Z])"
"class\\s*[a-zA-Z]"
"^class\\s+[a-zA-Z]$"

这些都不起作用。

感谢。

2 个答案:

答案 0 :(得分:2)

这是我使用的正则表达式:

(final|abstract|\n|^) {0,}class {1,}.{1,} {0,}\\{

这也将得到包括implements /接口在内的测试。这是我用来解析它们的代码,只是获取类名:

        String match = m.group();//m is my matcher for the regex
        String s = match.substring(match.indexOf("class ") + "class ".length(), match.lastIndexOf("{")).trim();
        if(s.contains("extends"))
            s=s.substring(0, s.indexOf("extends"));
        if(s.contains("implements"))
            s=s.substring(0, s.indexOf("implements"));
        s=s.trim();
        strings.add(s);

注意:这不适用于公共类或私有类,只适用于那些只有最终/抽象修饰符的类

答案 1 :(得分:2)

我害怕说它们有效,但还有改进的余地:

\bclass(\s+)([a-zA-Z_]\w*)\b

是一个更好的正则表达式。你没有匹配数字。

当然,这就是你应该如何在Java中使用它:

String regex = "\\bclass(\\s+)([a-zA-Z_]\\w*)\\b";

要匹配更多:

\b((public|private|protected|static|abstract|final)\s*)*class(\s+)([a-zA-Z_]\w*)\b

演示:

enter image description here