我正在编写一个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
。因此,正则表达式会在上面的示例中选择Fizz
和Buzz
,但不会Foo
或Bar
。
我最好的尝试是:
String regex = "import blah.example*client*";
if(someString.matches(regex))
// Do something
这个正则表达式并没有抛出异常,但它不起作用。我哪里错了?提前谢谢!
答案 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;