否定正则表达式PO BOX

时间:2010-12-30 15:48:19

标签: regex

我有一个下面的正则表达式,如果找到邮政信箱办公室组合

,则返回true
\b[P|p]*(OST|ost)*\.*\s*[O|o|0]*(ffice|FFICE)*\.*\s*[B|b][O|o|0][X|x]\b

如果特定的字符串有po box office的组合,那么我想要与此完全相反,那么它应该返回false,否则允许每一件事

有人可以帮我这个吗

4 个答案:

答案 0 :(得分:7)

伪代码:

if not regex.matches(string)
  ...
end if

没有简单的方法可以使正则表达式匹配“除了复杂的表达式之外的所有东西”。

匹配表达式并否定结果。

此外,您的正则表达式方式变得复杂。尝试

\bp(ost)?[.\s-]*o(ffice)?[.\s-]+box\b

设置了单行模式和ignore-case标志。我认为确实不需要匹配0代替o,但这取决于您。如果必须,请使用[o0]

答案 1 :(得分:7)

try mine

// leon's p.o. box detection regex
// for better results, trim and compress whitespace first

var pobox_re = /^box[^a-z]|(p[-. ]?o.?[- ]?|post office )b(.|ox)/i,
    arr = [
      "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",
      "box 122",
      "Box122",
      "Box-122",
    ];

for (var i in arr)
    console.log(pobox_re.test(arr[i]));

答案 2 :(得分:2)

非常感谢您的帮助,但我找到了解决方案

(?i:^(?!([\s|\0-9a-zA-Z. ,:/$&#'-]*|p[\s|\.|, ]*|post[\s|\.]*)(o[\s|\.|, ]*|office[\s|\. ]*)(box[\s|\. ]*))[0-9a-zA-Z. ,:/$&#'-]*$)

答案 3 :(得分:0)

在剥离字符类中的|并删除一些不适当的转义后,我在Perl中尝试了你的正则表达式。似乎没问题,虽然有点消极(?!)。

use strict;
use warnings;

my $regex = qr/
 (?i:
   ^
      (?!
          (     [\s0-9a-zA-Z. ,:\$&#'-]*
             |  p[\s., ]*
             |  post[\s.]*
          )
          (     o[\s., ]*
             |  office[\s. ]*
          )
          (
                box[\s. ]*
          )
      )
      [0-9a-zA-Z. ,:\$&#'-]*
   $
 ) /x;

my @tests = (
    'this is a  Post office box 25050 ',
    'PO Box 25050 ',
    'Post Box 25050 ',
);

for my $sample (@tests) {
    if ($sample =~ /$regex/) {
        print "Passed  -  $sample\n";
    }
}

__END__

Passed  -  Post Box 25050