正则表达式匹配邮政信箱地址

时间:2014-03-04 14:56:11

标签: java regex

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

  

/ ^ \ S *((P(OST)\ S *(O(FF(ICE)))\ S +(B(IN |??????OX)))| 2 B(IN | OX))/ I

要测试的字符串 - 邮箱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/在线测试了该表达式,并且表示测试字符串匹配

3 个答案:

答案 0 :(得分:4)

像这样改变你的模式:

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 ...
}

答案 1 :(得分:3)

在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使用{/ 1}}方法,例如

find

答案 2 :(得分:-1)

正则表达式检查邮政信箱地址,专门针对美国地址:

这对我来说非常有效。

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 PO BOX Benjamin Street:有效

P Browny House:无效

社区 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;