【问题标题】:Regex to search for lower-case Enum constants正则表达式搜索小写枚举常量
【发布时间】:2019-06-23 08:25:18
【问题描述】:

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

 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
    }

任何帮助将不胜感激。

【问题讨论】:

    标签: java android regex enums checkstyle


    【解决方案1】:

    试试这个正则表达式:

    ^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+ 个单词字母(仅当上述否定前瞻条件为真时)
    • (?:\s*,\s*(?!\b[A-Z]+\b)\w+)* - 匹配 0+ 个其他此类枚举值
    • \s*} - 匹配 0+ 个空格,后跟 }

    【讨论】:

    • 这太棒了,也感谢每个部分的详细解释,这真的有助于我理解发生了什么。只有一种情况它失败了,它:``` enum TransparencyState { Gone, TRANSLUCENT, Opaque } ``` 它应该匹配那里的小写常量,但我不知道如何匹配,跳过了一些项目。
    • 这是棘手的部分。如果可以的话,我会更新主题
    • THIS 匹配您想要的,但它不检查 enum。如果它们用大括号括起来,它将找到所有这些词。不确定它是否有任何帮助。
    • 嗯,我想知道我们是否可以以某种方式将两者结合起来,使其与第一个枚举匹配。无论哪种方式,感谢您抽出宝贵的时间来做这件事,您帮助我深入推进了这件事。
    • 当开发人员开始记录他们的枚举值时将失败:regex101.com/r/327sMV/1
    【解决方案2】:

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

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

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

    您必须在项目中包含 sevntu 才能使用自定义检查,无论是通过 maven 还是在命令行中附加 jar 等...

    【讨论】:

    • 这是要走的路,比用正则表达式解析Java可靠得多。
    • 是的,但我不想在我的项目中添加另一个依赖项,这就是为什么我首先尝试使用 Checkstyle 正则表达式来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2013-05-02
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    相关资源
    最近更新 更多