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

2022-09-03 16:36:40

我有一些复杂的正则表达式,我需要注释以提高可读性和维护。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]+)";

但这最终会在初始位置提取空间


答案 1

请参阅Martin FowlerComposedRegex上的帖子,以获取有关提高正则表达式可读性的更多想法。总之,他主张将复杂的正则表达式分解成更小的部分,这些部分可以被赋予有意义的变量名称。例如:

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

答案 2

你为什么不这样做:

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

延续:

如果要将注释与模式一起保留,并且需要从属性文件中读取它,请使用:

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