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

标签 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

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

最佳答案

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

"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/

相关文章:

Java 正则表达式 : exact match from a given point at the middle of the input

java - 包含 5 个数字或没有数字的字符串的正则表达式

java - Scala/Java 媒体框架?

java - 如何知道类上的有界类型参数

java - Facebook 登录 sdk - Android

regex - 使用 Perl 正则表达式查找井号 (#)

java - 下载 iis 连接器,在 iis 中启动 java 应用程序

regex - vim 将字符替换为\n

c++ - 字符串二进制组合

Java:枚举 toString()