1) Pattern pattern = Pattern.compile("34238");
Matcher matcher = pattern.matcher("6003 Honore Ave Suite 101 Sarasota Florida,
34238");
if (matcher.find()) {
System.out.println("ok");
}
2) Pattern pattern = Pattern.compile("^[0-9]{5}(?:-[0-9]{4})?$");
Matcher matcher = pattern.matcher("34238");
if (matcher.find()) {
System.out.println("ok");
}
上述代码的输出为:确定
但以下代码不打印任何内容:
Pattern pattern = Pattern.compile("^[0-9]{5}(?:-[0-9]{4})?$");
Matcher matcher = pattern.matcher("6003 Honore Ave Suite 101 Sarasota Florida, 34238");
if (matcher.find()) {
System.out.println("ok");
}
这是不是打印确定的原因是什么?我也在这里使用相同的模式。
答案 0 :(得分:2)
代码很好并且按预期工作。在您的问题的2)
和3)
块中,您使用的是相同的正则表达式但输入字符串不同。
但是,如果您只想检查字符串是否必须包含美国邮政编码,那么问题是您的正则表达式使用的是锚点,因此您只匹配以邮政编码开头和结尾的行。
与您的正则表达式匹配的字符串类似于34238
或34238-1234
,与something 12345 something
不匹配。
如果您删除了锚点,那么您将匹配whatever 12345 whatever
:
// Pattern pattern = Pattern.compile("^[0-9]{5}(?:-[0-9]{4})?$");
// ^--------- Here -------^
Pattern pattern = Pattern.compile("[0-9]{5}(?:-[0-9]{4})?");
Matcher matcher = pattern.matcher("6003 Honore Ave Suite 101 Sarasota Florida, 34238");
if (matcher.find()) {
System.out.println("ok");
}
顺便说一句,如果您只想检查字符串是否包含邮政编码,那么您可以使用String.matches(..)
,如下所示:
String str = "6003 Honore Ave Suite 101 Sarasota Florida, 34238";
if (str.matches(".*[0-9]{5}(?:-[0-9]{4})?.*")) {
System.out.println("ok");
}
<强> IDEOne demo 强>
答案 1 :(得分:2)
虽然模式相同,但输入字符串不同:
^...$
表达式的匹配^
锚点会阻止您的正则表达式匹配。 ^
和$
个锚点。如果您想在开头匹配,请保留^
并移除$
;如果您想在最后匹配,请移除^
并保留$
;当你想匹配字符串中的任何地方时,删除两个锚点。