我今天在遗留代码中遇到了一个错误,该代码使用Perl5Compiler
和Perl5Matcher
使用以下正则表达式验证英国邮政编码:
((?i)(([A-Z]{2}[0-9]{1,2})|([A-Z]{1,2}[0-9][A-Z])|([A-Z][0-9]{1,2}))\\s([0-9][A-Z]{2})|(BFPO\\s\\d{1,4})|(GIR\\s0AA))
然而,它无法正确验证诸如'G12 4NNT'之类的邮政编码(在这种情况下,最后一部分只允许是一个数字后跟2个字母)。我通过使用正确使用上述正则表达式的java.util.regex.Pattern
类来修复此问题,并通过了所有单元测试。
然而,现在我很好奇为什么它不适用于Perl5
。两个API使用的正则表达式语法是否存在根本区别?
答案 0 :(得分:2)
我认为问题与question to the above linked answer中的问题相同。
如果您在Java中使用matches()
方法:
text.matches("((?i)(([A-Z]{2}[0-9]{1,2})|([A-Z]{1,2}[0-9][A-Z])|([A-Z][0-9]{1,2}))\\s([0-9][A-Z]{2})|(BFPO\\s\\d{1,4})|(GIR\\s0AA))");
它匹配完整的字符串,要在Perl中具有相同的行为,你必须锚定你的表达式:
^((?i)(([A-Z]{2}[0-9]{1,2})|([A-Z]{1,2}[0-9][A-Z])|([A-Z][0-9]{1,2}))\\s([0-9][A-Z]{2})|(BFPO\\s\\d{1,4})|(GIR\\s0AA))$
^
匹配字符串的开头
$
匹配字符串