【问题标题】:Regular Expression to match PO Box address正则表达式匹配邮政信箱地址
【发布时间】:2014-03-04 14:56:10
【问题描述】:

我正在使用这个正则表达式来捕获“PO Box”字符串。当我在线测试时,这似乎有效,但下面的 javacode 打印错误。我犯了什么错误?

/^\s*((P(OST)?.?\s*(O(FF(ICE)?)?)?.?\s+(B(IN|OX))?)|B(IN |OX))/我

要测试的字符串 - 邮政信箱 1234

    String spattern = "/^\\s*((P(OST)?.?\\s*(O(FF(ICE)?)?)?.?\\s+(B(IN|OX))?)|B(IN|OX))/i";

    String regex = "PO Box 1234";

    Pattern pattern = Pattern.compile(spattern);

    System.out.println(pattern.matcher(regex).matches());

我在http://regex101.com/ 在线测试了表达式,它说测试字符串匹配

【问题讨论】:

    标签: java regex


    【解决方案1】:

    像这样改变你的模式:

    String spattern = "(?i)^\\s*((P(OST)?.?\\s*(O(FF(ICE)?)?)?.?\\s+(B(IN|OX))?)|B(IN|OX))";
    

    如果你知道你不会经常使用你的模式,你可以试试这个:

    String myInput = ....
    
    if (myInput.matches(spattern)) {
         // myInput is a PO BOX ...
    } else {
         // myInput isn't a PO BOX ...
    }
    

    【讨论】:

      【解决方案2】:

      在 Java 中,您不使用 /regex/flags 形式。相反,您可以执行类似

      的操作
      Pattern.compile(regex, flags);
      

      所以删除 //i 并尝试使用

      String spattern = "^\\s*((P(OST)?.?\\s*(O(FF(ICE)?)?)?.?\\s+(B(IN|OX))?)|B(IN|OX))";
      Pattern pattern = Pattern.compile(spattern, Pattern.CASE_INSENSITIVE);
      

      您也可以将标志直接传递给正则表达式字符串。只需在开头添加(?i) 以获取不区分大小写的正则表达式。您可以在任何地方添加此标志,具体取决于它应该影响的范围。例如,如果您像这样放置a(?i)a,正则表达式将能够匹配aaaA,但不能匹配AaAA,因为标志从第一个和第二个a 之间的点起作用。同样,a((?i)a)a 将匹配 aaaaAa,但不会匹配 AAaaAA,因为 (?i) 仅影响组 1 的范围(括号中的部分)。更多信息http://www.regular-expressions.info/modifiers.html


      另外,matches 方法检查 整个字符串 是否被正则表达式匹配,而不是字符串 包含 部分是否可以被正则表达式匹配。也许不是matches 使用find 方法,如

      System.out.println(pattern.matcher(regex).find());
      

      【讨论】:

        【解决方案3】:

        正则表达式检查邮政信箱地址,特别是美国地址:

        这对我来说非常适合。

        Java:

        static final String thePattern = "(?i)([\w\s*\W](P(OST)?.?\s((O(FF(ICE)?) ?).?\s*(B(IN|OX|.?)))+))[\w\s*\W]|(COMMUNITY\s)?POST(AL)? \s*(OFF(ICE)?(\s*(BOX|BOZ|BX))?|(BOX|BX))|(^\s*(BOXOC|P\.?0\.?))";

        上述正则表达式将检测到的样本:

        邮局信箱:有效

        邮政信箱 DesMoines1000:有效

        本杰明街 1316 号邮政信箱:有效

        P 布朗尼屋:无效

        社区 P 框:无效

        P 装箱:无效

        P Binter:无效

        JavaScript:

        var regex = /^([\w\s*\W](P(OST)?.?\s((O(FF(ICE)?)?).?\ s*(B(IN|OX|.?)))+))[\w\s*\W]|(COMMUNITY\s)?POST(AL)?\s*(OFF (ICE)?(\s*(BOX|BOZ|BX))?|(BOX|BX))|(^\s*(BOXOC|P.?0.?))$/i;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-06
          • 1970-01-01
          • 2019-03-23
          • 2020-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-12-15
          相关资源
          最近更新 更多