我有我需要的可读性和维护评论一些复杂的正则表达式。 Java规范是相当简洁,我挣扎了很长一段时间得到这个工作。 我终于抓住了我的错误,将发布它作为一个答案,但我会有关维护正则表达式的任何其他方面的建议表示感谢
作为一个例子,我想在一个简单的名称解析器评论的子(图案):
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]+)";
但最终会在最初的提取空间
看到帖子由马丁·福勒在ComposedRegex用于改善正则表达式的可读性一些更多的想法。 总之,他主张打破复杂的正则表达式成可以给出有意义的变量名更小的部分。 例如
String mandatoryName = "([A-Za-z]+)";
String mandatoryWhiteSpace = "\\s+";
String optionalInitial = "([A-Z]\\.)?";
String pattern = mandatoryName + mandatoryWhiteSpace + optionalInitial +
mandatoryWhiteSpace + mandatoryName;
你为什么不只是这样做:
String pattern2S =
"([A-Za-z]+)" + // mandatory firstName
"\\s+" + // mandatory whitespace
...;
继续:
如果你想保持与该模式的意见,你需要从属性文件读取它,使用:
pattern=\
#comment1\\n\
(A-z)\
#comment2\\n\
(0-9)
我发现了以下工作:
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明确