正则表达式适用于java.util.regex.Pattern但不适用于com.oroinc.text.regex.Perl5Matcher

时间:2013-03-07 14:56:46

标签: java regex perl

我今天在遗留代码中遇到了一个错误,该代码使用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使用的正则表达式语法是否存在根本区别?

1 个答案:

答案 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))$

^匹配字符串的开头

$匹配字符串

的结尾