有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

正则表达式适用于java。util。正则表达式。模式,但不是com。奥罗公司。文本正则表达式。Perl5匹配器

我今天在我们的遗留代码中遇到了一个bug,它使用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”(在本例中,最后一部分仅允许是一个数字,后面跟着两个字母)。我通过使用java.util.regex.Pattern类修复了这个问题,该类正确地使用了上述正则表达式,并通过了我所有的单元测试

然而,现在我很好奇为什么它不适用于Perl5。这两个API使用的正则表达式语法有根本区别吗


共 (1) 个答案

  1. # 1 楼答案

    我认为问题与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))$
    

    ^匹配字符串的开头

    $匹配字符串的结尾