在Java正则表达式中包含注释

pet*_*ust 14 java regex comments

我有一些复杂的正则表达式,我需要评论它们的可读性和维护性.Java规范相当简洁,我努力工作很长时间.我终于发现了我的错误,并将其作为答案发布,但我很感激有关维护正则表达式的任何其他建议

作为一个例子,我想在一个简单的名称解析器中注释(patternS)的子组件:

    String testTarget = "Waldorf T. Flywheel";
    String patternS = "([A-Za-z]+)\\s+([A-Z]\\.)?\\s+([A-Za-z]+)";
    Pattern pattern = Pattern.compile(patternS, Pattern.COMMENTS);
    Assert.assertTrue(pattern.matcher(testTarget).matches());
Run Code Online (Sandbox Code Playgroud)

编辑:我也很感谢(?x)格式的例子.

编辑:@ geowa4有一个很好的建议,避免嵌入的评论.Sinnce java和其他人提供了嵌入式注释它们有用的情况是什么?(我想我有一个案子,但我有兴趣看到其他人).

编辑:正如下面提到的@mikej,正则表达式不支持可选的初始井,并且会更好:

        String patternS = "([A-Za-z]+)\\s+([A-Z]\\.\\s+)?([A-Za-z]+)";
Run Code Online (Sandbox Code Playgroud)

但这最终会在最初提取空间

mik*_*kej 21

请参阅Martin Fowler关于ComposedRegex的文章,了解有关提高regexp可读性的更多想法.总而言之,他主张将复杂的正则表达式分解为可以赋予有意义的变量名称的较小部分.例如

String mandatoryName = "([A-Za-z]+)";
String mandatoryWhiteSpace = "\\s+";
String optionalInitial = "([A-Z]\\.)?";
String pattern = mandatoryName + mandatoryWhiteSpace + optionalInitial +
    mandatoryWhiteSpace + mandatoryName;
Run Code Online (Sandbox Code Playgroud)


geo*_*wa4 15

你为什么不这样做:

String pattern2S = 
    "([A-Za-z]+)" + //    mandatory firstName
    "\\s+" +        //    mandatory whitespace
    ...;
Run Code Online (Sandbox Code Playgroud)

继续:

如果要保留带有模式的注释,并且需要从属性文件中读取它,请使用以下命令:

pattern=\
#comment1\\n\
(A-z)\
#comment2\\n\
(0-9)
Run Code Online (Sandbox Code Playgroud)


pet*_*ust 12

我发现以下工作:

        String pattern2S = 
            "([A-Za-z]+)      # mandatory firstName\n" +
            "\\s+             # mandatory whitespace\n " +
            "([A-Z]\\.)?      # optional initial\n" +
            "\\s+             # whitespace\n " +
            "([A-Za-z]+)      # mandatory lastName\n"; 
Run Code Online (Sandbox Code Playgroud)

关键是要在字符串中明确包含换行符\n

  • 哦,Pattern.COMMENTS 是关键。 (2认同)