正则表达式获取Java导入语句

时间:2013-08-16 02:52:57

标签: java regex string

我正在编写一个Java程序来读取其他Java源文件并提取import语句:

package com.me.myapp

import blah.example.dog.client.Fizz;
import blah.example.cat.whiskers.client.Buzz;
import blah.example.shared.Foo;
import blah.example.server.Bar;
...etc.

我希望正则表达式返回以import blah.example.开头的任何内容,然后在包名称中包含client。因此,正则表达式会在上面的示例中选择FizzBuzz,但不会FooBar

我最好的尝试是:

String regex = "import blah.example*client*";
if(someString.matches(regex))
    // Do something

这个正则表达式并没有抛出异常,但它不起作用。我哪里错了?提前谢谢!

5 个答案:

答案 0 :(得分:2)

正则表达式中的点是一个特殊字符,表示“任何字符”。你必须转义一个文字点,并且你想在*之前有一个点(意味着任何字符的出现次数):

"import blah\\.example.*client.*"

表达方式:

"import blah.example*client*"

意味着“导入blah”,然后是单个通配符,后跟“exampl”,然后是0或更多e,然后是“clien”,然后是0或更多t。比如“import blahxexampleeeeeclientttt”或“import blah examplclien”。

此外,(固定)正则表达式仍将匹配“import blah.example2.notclient”和“/ * import blah.example.client; * /”之类的内容,因此您仍然希望强制执行文字点的位置客户和行的开始,例如(为了清楚起见未转义,请记住在字符串常量中转义斜杠):

^import blah\.example(\.[^.]+)*\.client(\.[^.]+)*;

序列(为清晰起见未转义):

(\.[^.]+)*

匹配任意数量的单个“.xxx”路径组件。

但是,请注意,就像布拉德·梅斯在评论中指出的那样,仅仅正则表达式仍然不可靠。你没有一个好的方法可以跳过,例如一堆由/ * * / multiline注释注释掉的import语句。

答案 1 :(得分:2)

您可以尝试使用带有MULTILINE标志的^import blah[.]example[.](\\w+[.])*client[.]\\w+;$来使^和$匹配也可以开始和结束新行。

以下是一些演示:

String data = "package com.me.myapp\n\nimport blah.example.dog.client.Fizz;\nimport blah.example.cat.whiskers.client.Buzz;\nimport blah.example.shared.Foo;\nimport blah.example.server.Bar;";

Pattern p = Pattern.compile(
        "^import blah[.]example[.](\\w+[.])*client[.]\\w+;$",
        Pattern.MULTILINE);
Matcher m = p.matcher(data);
while (m.find())
    System.out.println(m.group());

输出

import blah.example.dog.client.Fizz;
import blah.example.cat.whiskers.client.Buzz;

您也可以使用类似的正则表达式来检查它是否与您的字符串/行匹配

String data = "package com.me.myapp\n\nimport blah.example.dog.client.Fizz;\nimport blah.example.cat.whiskers.client.Buzz;\nimport blah.example.shared.Foo;\nimport blah.example.server.Bar;";

Scanner scanner = new Scanner(data);
while (scanner.hasNextLine()){
    String line=scanner.nextLine();
    if (line.matches("import blah[.]example[.](\\w+[.])*client[.]\\w+;")){
        System.out.println(line);
    }
}

答案 2 :(得分:1)

假设someString是Java源代码中的一行

Java字符串

"import\\s+blah\\.example(?:\\.\\w+)*\\.client(?:\\.\\*|(?:\\.\\w+)*);"

正则表达式

import\s+blah\.example(?:\.\w+)*\.client(?:\.\*|(?:\.\w+)*);

答案 3 :(得分:1)

将源列为文本文件可能会有问题......

我会尝试以下方法:  *使用javac处理器框架将您的匹配器集成到编译器中  *使用ASM库

答案 4 :(得分:0)

正则表达式可能会错误地解析src,例如注释掉导入

/*
import blah.example.dog.client.Fizz;
import blah.example.cat.whiskers.client.Buzz;
*/

或未格式化的代码

import blah.example.dog.client.Fizz; import blah.example.cat.whiskers.client.Buzz;