【问题标题】:Is it possible to write a regex to extract java package?是否可以编写正则表达式来提取 java 包?
【发布时间】:2016-03-11 18:25:42
【问题描述】:

是否可以编写一个正则表达式,将包路径提取到 .java 文件中?

类似这样的:

package java.awt.event;
// java code

到这里

java.awt.event

我可以解析到文件夹位置吗?

java/awt/event/

我不知道一个包可以有哪些字符,或者是否可以添加多个包。

【问题讨论】:

  • 你只能有一个包...为什么你需要这个来自Java源代码?
  • 好吧,我不想让用户对我说(可用性原因),所以我认为我们可以提取它们。我需要正确的文件结构来编译 java 文件;)
  • 是的,这是可能的。到目前为止你尝试过什么?
  • 我已经尝试了一些基本的字符串操作。想将文件分成几行并在那里查找包,我对正则表达式不太熟悉,但我认为这将是一个更好的方法!
  • @PhilippSpieß 如果您需要从 Java 文件的源代码中提取包信息以便正确编译它......有些不对劲,或者您并没有真正提出您想要回答的问题。

标签: java regex package


【解决方案1】:
"package\\s+([a-zA_Z_][\\.\\w]*);"

java 文件的开头只能有一个包。只有单词字符和“。”是允许的。

"package\\s+" => the work "package" followed by at least one space
"("           => start of capture
"[a-zA-Z_]"   => first character of package (doesn't include numeric digits)
"[\\.\\w]*"   => any number of word characters (a-zA-Z0-9_) plus the "." character
")"           => end of capture
";"           => end of line

真的这不是最好的,因为它不强制每个文件夹的第一个字符不是数字,但是它可以在没有完全执行规则的情况下工作。在这种情况下,以下可能会更容易:

"package\\s+([\\w\\.]+);"

【讨论】:

  • 数字是允许的(只是不能作为第一个字符)
  • 是的,但我的意思是 \\w 允许数字。所以正确的应该是 "([a-zA-Z_]([\\w\\.]*...."。不过我也知道我的错在哪里,所以很好。;)
  • 我很难决定要标记哪个,但我猜它是你的,因为你是第一个并编辑了你的答案。 ;D
  • 嗨!我发现你的答案是迄今为止最好的,你介意解释一下正则表达式吗,我有点迷路了:(
  • 这个答案不完全有效:1)包名可能包含非ascii字符2)按照约定第一部分只包含小写ascii字符
【解决方案2】:

您只能有 1 个包声明,并且允许的语法与普通标识符相同

"package ([\\w&&\\D]([\\w\\.]*[\\w])?);"

捕获组 1 将用包替换 .有了文件分隔符,你就在那里

【讨论】:

  • 我相信 \\w 包括 \\d。 \\w 是任何有效的单词字符,包括数字。
  • @JohnB 是的,我注意到它已修复(请注意,我的正则表达式也不允许 . 作为最后一个字符)
  • 是的,我认为你的比我的好。干杯!
【解决方案3】:

这个正则表达式完美运行:

package\\s([a-zA-Z]\\w*)(\\.[a-zA-Z]\\w*)*;"\

匹配:

  • “包”
  • 空格
  • 以非数字字符开头的包定义
  • 任何子包定义
  • ";"

【讨论】:

    【解决方案4】:

    我知道这是延迟的,但我想贡献我制作的这个,它特别适用于 Android 包名称约定。

      (^[a-z]+[.][a-z]+[.][a-z]+($|[.][a-z]+$))
    

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 2016-11-28
      相关资源
      最近更新 更多