正则表达式搜索小写的Enum常量

时间:2019-01-30 05:54:39

标签: java android regex enums checkstyle

我正在尝试使用正则表达式来解析小写的枚举,例如:

 enum TransparencyState {
        Gone, Translucent, Opaque
    }

 enum TransparencyState {
        gone, 
        translucent, 
        opaque
    }

但是,我能得到的最接近的是(?:enum\s+[a-zA-Z0-9]+\s*\{|\G)\s+([a-zA-Z0-9_,\s]*)(?=[^{}]*\}),但这并不完全有效。理想情况下,它只匹配枚举列表中的小写常量,除了所有大写字母(基本上是下面的常量形式)之外的任何东西。

不匹配:

 enum TransparencyState {
        GONE, TRANSLUCENT, OPAQUE_OR_DULL
    }

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

尝试此正则表达式:

^enum[^{]*{\s*(?!\b[A-Z]+\b)(\w+(?:\s*,\s*(?!\b[A-Z]+\b)\w+)*)\s*}

Click for Demo

在JAVA中,将每个\换成另一个\

说明:

  • ^-断言行的开头
  • enum[^{]*{\s*-匹配enum,然后匹配0+次出现的不是{的字符,再匹配{,再匹配0+空格,并尽可能
  • (?!\b[A-Z]+\b)-前瞻,以确保下一个单词(枚举值)不只包含大写字母
  • \w+-匹配1个以上出现的单词字母(仅当上述否定的先行条件为true时)
  • (?:\s*,\s*(?!\b[A-Z]+\b)\w+)*-匹配0+其他此类枚举值
  • \s*}-匹配0+空格,后跟}

答案 1 :(得分:2)

由于您在此标记了checkstyle,因此可以使用sevntu中的自定义检查为枚举常量实施特定的命名约定。不需要复杂的正则表达式。

    <module name="EnumValueNameCheck">
        <property name="format" value="^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>
    </module>

这将强制所有枚举常量为大写字母和数字,并允许带下划线。

您必须在项目中包括sevntu才能使用自定义检查,方法是通过maven或在命令行中添加jar等等。