用于从规范类名解析Java包和类名的正则表达式

时间:2018-07-15 01:57:11

标签: java regex

我正在配置一个使用正则表达式解析日志的日志解析系统(Logstash)。我正在尝试从规范的(即完全限定的)Java类名中解析出一个包名和类名,但是我不太清楚。

以下是一些示例输入

  1. UnpackagedClass
  2. somepackage.SomeClass
  3. java.lang.Object
  4. java.util.function.Function

预期的输出(捕获组):

  1. (空字符串),UnpackagedClass
  2. somepackageSomeClass
  3. java.langObject
  4. java.util.functionFunction

这是我尝试的方法:((?:(?:X)\.)*)((?:X)),其中X[a-zA-Z_$][a-zA-Z\d_$]*,它是Java标识符的正则表达式。完全展开,它是:((?:(?:[a-zA-Z_$][a-zA-Z\d_$]*)\.)*)((?:[a-zA-Z_$][a-zA-Z\d_$]*))。已经结束了,但是在软件包名称后面有一段尾随的时期,它们被捕获为软件包名称的一部分:

  1. (空字符串),UnpackagedClass
  2. somepackage.SomeClass
  3. java.lang.Object
  4. java.util.function.Function

关于如何改善此问题的任何建议? a RegExr playground可以为您提供帮助。

1 个答案:

答案 0 :(得分:4)

使用:(?:(X(?:\.X)*)\.)?(X)

它将在组1中拥有包名称(如果未命名,则为null,在组2中具有类名称。

有关演示,请参见regex101.com