用于PO Box验证的Java Regex

时间:2015-02-28 15:07:56

标签: java regex

我正在使用以下正则表达式进行PO BOX模式验证 -



"([\\w\\s*\\W]*(P(OST)?.?\\s*((O(FF(ICE)?)?)?.?\\s*(B(IN|OX|.?))|B(IN|OX))+))[\\w\\s*\\W]*"
;




以下是一些测试结果 -

邮政信箱:有效 P O Box:有效 P. O. Box:有效 P.O.Box:有效 邮政信箱:有效 邮政信箱:有效 邮局:无效 P.O.B:有效 P.O.B. :有效 POB:有效 邮局垃圾箱:有效 方框:无效 宾:无效 发布:无效 邮政编码:无效 100 ,, P O Box Des Moines:有效  P O Box DesMoines1000:有效  P O Box Des Moines 1000:有效  邮政信箱:有效  邮政信箱:有效 邮箱#:有效

然而,这是验证 Hope Bulevard Pablo Avenue 作为有效的PO BOX模式。任何建议将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:1)

这是因为点匹配任何字符。您希望使用\.来匹配文字点。

"([\\w\\s*\\W]*(P(OST)?\\.?\\s*((O(FF(ICE)?)?)?\\.?\\s*(B(IN|OX|\\.?))|B(IN|OX))+))[\\w\\s*\\W]*"

对我来说,它看起来也很复杂。它还允许太多字符串。你有'框'重复,因此它匹配PBINBIN'。

此外,您不需要前导和尾随部分。

"(P(OST)?\\.?\\s*(O(FF(ICE)?)?)?\\.?\\s*B(IN|OX|\\.?))"

这种模式仍然是非常宽松的,并且允许用非常奇怪的方式来编写“BO BOX”,例如' POST。关闭B'。您应该查看数据并仅匹配真正出现的正字法。

为了确保POB不是另一个单词的一部分,您应该使用单词分隔符。通常它是\b,但我不确定它在Java中是否相同。

"\\b(P(OST)?\\.?\\s*(O(FF(ICE)?)?)?\\.?\\s*B(IN\\b|OX\\b|\\.?))"

一般性评论:您似乎通过反复试验来编写代码。这是一个糟糕的编程原则。当你接近像这样的启发式问题时,必然会出现误报和漏报,你必须权衡两者的成本,然后从最简单的解决方案开始,直到错误结果落在可接受的水平之下。

答案 1 :(得分:0)

public static final Pattern US_PO_BOX_REGEX = Pattern.compile("^box[^a-z]|([a-z]?p[-\\.\\s#>,\\?]*?(o|0|p)?o?l?[-\\.\\s#>,\\?]*?|(post|postal)\\s*(office)?)[\\s\\w]*?b(.|ox)(.*)?", Pattern.CASE_INSENSITIVE);

肯定匹配测试字符串:

List<String> poBoxAffirmativeTestStrings = Arrays.asList("po box", "p.o.b.", "p.o. box", "po-box", "p.o.-box", "PO-Box", "p.o box", "pobox", "p-o-box", "p-o box", "post office box", "P.O. Box", "PO Box", "PO box", "po box ", "  PO Box", " P O Box", " P. O. Box", " P.O Box", " P.O. Box", " PO Box", "gpo Box", "P  O Box", "p .o. Box", "P O  Box", "P O . Box", "P O Box", "P O. Box", "P P Box", "P,O, Box", "P,O. Box", "P.  O. Box", "P. 0. Box", "P. Box ", "P. O . Box", "P. O Box", "P. O. Box", "P. O. Box", "P.0 Box", "P.0. Box", "P.Box. Box", "P.O . Box", "P.O Box", "P.O, Box", "P.O.  Box", "P.O. Box", "P.O? Box", "P.O> Box", "P?O. Box", "P>. O. Box", "P>O> Box", "PO   Box", "PO  Box", "PO a Box", "po Box ", "PO# Box", "PO. Box", "Poo Box", "pool Box", "Post Box", "Post Office Box", "Postal Office Box");

测试字符串来自超过1,000,000个用户,因此它涵盖了大量样本或用户错误。我使用数据库中的地址数据对此正则表达式进行负面测试而没有发生任何事故。我正在寻找误报,找不到任何“正常”地址。

如果您使用此功能并且发现缺少肯定或误报示例,请在此处发布更新的正则表达式。