我正在使用此正则表达式来捕获“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/在线测试了该表达式,并且表示测试字符串匹配
答案 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
正则表达式将能够匹配aa
和aA
但不能匹配Aa
或AA
,因为标志在第一个点之间起作用第二个a
。同样,a((?i)a)a
将与aaa
和aAa
匹配,但不会与AAa
或aAA
匹配,因为(?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;