【发布时间】:2011-11-08 00:33:09
【问题描述】:
我有以下正则表达式,但它不能满足我的要求。
"(?i)\b(?:p(?:ost)?\.?\s*[o0](?:ffice)?\.?\s*b(?:[o0]x)?|b[o0]x)"
123 post office
123 post office box
post office
po box
po 12 box
35 po box
PO.Box
p.o.box
以上示例在我当前的正则表达式中失败
【问题讨论】:
我有以下正则表达式,但它不能满足我的要求。
"(?i)\b(?:p(?:ost)?\.?\s*[o0](?:ffice)?\.?\s*b(?:[o0]x)?|b[o0]x)"
123 post office
123 post office box
post office
po box
po 12 box
35 po box
PO.Box
p.o.box
以上示例在我当前的正则表达式中失败
【问题讨论】:
对于邮政信箱,您会发现不可能涵盖所有情况。这显然是你可能不想听到的,但他们是休息时间。当一个人开始用谷歌搜索解决方案时,这一点非常明显,因为相信我,我调查过这个,有很多解决方案。我见过的所有解决方案,我都不太在意。
因此,您必须回到邮政信箱地址的规则/标准。可以在维基百科上找到。它的格式为 PO Box, P.O. Box, Postal Office Box, P Office Box, Postal Box, Post Box,仅举一些标准格式的例子,当人们编写正则表达式以确定地址是否为邮政信箱时,他/她的规则所依据的标准格式。
话虽如此,这是我的解决方案。这很简单,因为它必须如此,用户会在邮箱中放入太多愚蠢的方式。你必须假设 p 或 postal 或其他东西 p 开始一个邮政信箱的地址。这样,您就不会以 123 po 地址格式过滤具有单词 p 或 o 的某些变体的地址。我希望这是有道理的。
/^p+(ostal|ost|\.| )*o*(ffice|\.| )*(box)*/i
上面可以在http://www.rubular.com上测试,你需要去掉开头和结尾的正斜杠,并将i(不区分大小写的块中的文本字段放在右斜杠的右侧。
【讨论】:
如果您知道输入的是邮政信箱,请先尝试过滤掉任何文本,然后仅使用其中的号码。或者,只是将字符串小写,然后去掉字母 p、o、s、t、f、i、c、e、b、x,如果还有字母,那就不行了。
【讨论】:
不确定在“邮局”后面没有“框”的情况下过滤它有多准确。 以下正则表达式满足您列表中除“123 post office”和“post office”之外的所有条件。
@"\bp*[o0]*(st)*(al)*\.*\s*[o0]*(ffice)*\.*\s*b+[o0]?x+\b"
如果您将"b+[o0]?x+" 更改为"(b+[o0]?x+)*",它也会过滤掉这些。
希望这会有所帮助。
【讨论】: