0

我有一个来自另一个线程的函数,它有助于检测 POBox,但它并没有按预期工作。

function isPOBox(v){
    var r = new RegExp('[PDO.]*\\s?B(ox)?.*\\d+', 'i');
    return v.match(r);
}

如果我有值'Lvl 1 TowerB, 999 C G Road',它会错误地将其作为 PObox 拾取。
如您所见,P上面没有。

我将如何编辑正则表达式以更具体地围绕 POBoxes?

我在这里设置了一个演示小提琴:http: //jsfiddle.net/xCQwM/

4

2 回答 2

2

如果您查看实际匹配:

> "Lvl 1 TowerB, 999 C G Road".match(new RegExp('[PDO.]*\\s?B(ox)?.*\\d+',"i"))
[ 'B, 999',
  undefined,
  index: 11,
  input: 'Lvl 1 TowerB, 999 C G Road' ]

这是一场比赛,因为:

  • [PDO.]\*表示匹配的第一部分是可选的
  • \\s?是可选的
  • (ox)?是可选的
  • .*是可选的

与您的正则表达式匹配的一组字符串是:

"B" followed by any number of characters followed by a digit

在您的示例中,匹配看起来像

"B" matches "B"
"," matches ".*"
"999" matches "\\d+"

您需要提供有关您期望邮政信箱外观的更多详细信息,以便我们提供更好的正则表达式

于 2013-06-28T13:59:15.793 回答
0

正如您目前所说的那样,您的问题的答案是替换[PDO.]*为,[PDO.]+因此它至少匹配一个字符。你可能想使用([PDO]\\.){2}

我在想这样的事情可能会更好:

([PDO]\\.){2}\\s?B(ox|\\.)\\s?\\d+
于 2013-06-28T13:58:20.747 回答