正则表达式适用于java.util.regex.Pattern,但不适用于com.oroinc.text.regex.Perl5Matcher
今天我在我们的旧代码中遇到了一个bug,它使用正则表达式适用于java.util.regex.Pattern,但不适用于com.oroinc.text.regex.Perl5Matcher,java,regex,perl,Java,Regex,Perl,今天我在我们的旧代码中遇到了一个bug,它使用perl5编译器和perl5匹配器使用以下正则表达式验证英国邮政编码: ((?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.re
perl5编译器
和perl5匹配器
使用以下正则表达式验证英国邮政编码:
((?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
one。这两个API所使用的正则表达式语法有根本的区别吗?我认为问题与中的相同
如果在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))$
^
匹配字符串的开头
$
匹配字符串的结尾这可能会有帮助-。啊,是的,我现在明白了。谢谢你让我错过的细节!