我正在尝试从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]$"
这些都不起作用。
感谢。
答案 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
演示: