0

我今天在我们的遗留代码中遇到了一个错误,它使用Perl5CompilerPerl5Matcher使用以下正则表达式来验证英国邮政编码:

((?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 使用的正则表达式语法有根本区别吗?

4

1 回答 1

2

我认为问题与上述链接答案的问题相同。

如果您在 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))$

^匹配字符串的开头

$匹配字符串的结尾

于 2013-03-07T15:13:03.790 回答