Java 正则表达式模式在模式中有两个 \\p{Punct} 后不匹配?



我正在尝试根据位置验证具有正确格式的地址TextField,我的模式适用于除英国以外的所有国家/地区。我不太清楚这里发生了什么。我尝试过使用不同的正则表达式,但似乎找不到解决方案。我想要的格式是";123 ABC Street,Greenwich,London";。

以下是适用于美国地址格式的一些代码:

Pattern r = Pattern.compile("d+sw+sw+p{Punct}sw+sw+"); 
Matcher m = r.matcher(customerAddressText.getText());
if (m.find()) {    
customerAddress = customerAddressText.getText();
} else {    
throw new Exception();
}

此代码不适用于英国的地址格式:

//FIXME NOT WORKING CORRECTLY
Pattern r = Pattern.compile("d+sw+sw+p{Punct}sw+p{Punct}sw+");
Matcher m = r.matcher(customerAddressText.getText());
if (m.find()) {    
customerAddress = customerAddressText.getText();
} else {    
throw new Exception();
}

你想要的是完全不可能的。

地址不是那样的。

即使你的正则表达式"有效",它也要求街道由两个单词组成(它们没有(,所有地方都有门牌号(它们没有,所有城镇名称由一个单词组成(,所有城镇都被划分为区域(它们肯定没有(。

地址是出了名的难。没有什么是真的——并不是所有的地址都有街道或号码。例如,在迪拜,大多数地址都是一张画好的图片(这是你唯一可以放在信封正面的东西,可以把邮件送到正确的位置(。

因此,尝试编写正则表达式来查找街道地址?完全不可能。

正确的做法是采用标准的邮费规则体系。该系统具有以下属性:

  • 你会得到两行文字。为了完整起见,假设它是unicode
  • 一般来说,这些行都要大写
  • 邮政服务区还有第三行,通常是国家名称。前两行的含义完全取决于第三行

即使这些规则也不适用于所有地点,但这正是大多数国际邮费和it系统所标准化的,这就是为什么使用该系统可以将邮件发送到几乎所有地方的原因。试图弄清楚一行是否"有效"没有任何目的或意义。用户输入了它-相信他们知道如何投递邮件,这样他们就可以收到它

如果这是家庭作业,你唯一的可取之处就是。在这种情况下,你的教授/书肯定选了一个弥天大谎,这是一个非常糟糕的例子。无论如何,您的代码根本无法编译——在这两个示例中,所有这些反斜杠都需要加倍。

在修复了这个问题之后,您的第二个示例对"123 ABC Street, Greenwich, London"进行了很好的处理。如果它不适合你,那么那就不是你工作的实际街道地址。

也许是斯塔福德北城堡街0号,这表明即使是几乎每个人都会告诉你必须是真的(门牌号码不能是0(也是假的(点击该链接。注意门上的0,这是一个真实的地址(。它也完全不符合你的正则表达式:街道由3个单词组成,而不是2个单词,城镇没有分为一个地区(格林威治(和一个城市(伦敦(。是的。。只有一个城镇名称(斯塔福德(。

最新更新