我正在编写一个 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
这个正则表达式没有抛出异常,但它不起作用。我哪里出错了?提前致谢!
最佳答案
正则表达式中的点是一个特殊字符,表示“任何字符”。你必须转义一个字面点,并且你想要在你的 * 之前有一个点(意味着任何字符出现的任意次数):
"import blah\\.example.*client.*"
你的表达方式:
"import blah.example*client*"
意思是“import 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”路径组件。
但是请注意,就像 Brad Mace 在评论中指出的那样,单靠正则表达式对此仍然不可靠。你没有跳过的好方法,例如一堆由/* */多行注释注释掉的导入语句。
关于java - 获取 Java 导入语句的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18265099/