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

时间:2009-09-04 11:15:22

标签: 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());

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

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

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

        String patternS = "([A-Za-z]+)\\s+([A-Z]\\.\\s+)?([A-Za-z]+)";

但最终会在初始

中提取空间

3 个答案:

答案 0 :(得分:21)

Martin FowlerComposedRegex上查看有关提高regexp可读性的更多建议。总而言之,他主张将复杂的正则表达式分解为可以赋予有意义的变量名称的较小部分。 e.g。

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

答案 1 :(得分:15)

你为什么不这样做:

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

CONTINUATION:

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

pattern=\
#comment1\\n\
(A-z)\
#comment2\\n\
(0-9)

答案 2 :(得分: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"; 

关键是要在字符串

中明确包含换行符\ n