Отрицательный Regex PO BOX - PullRequest
       16

Отрицательный Regex PO BOX

2 голосов
/ 30 декабря 2010

У меня есть нижеследующее регулярное выражение, которое возвращает true, если находит комбинацию PO Box

\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 ]

7 голосов
/ 02 апреля 2011

попробуй мой :

// 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]));
7 голосов
/ 30 декабря 2010

Псевдокод:

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

Нет простого способа заставить регулярное выражение сопоставить «все, кроме сложного выражения».

Сопоставить выражение и отменить результат.

Кроме того, ваше регулярное выражение способ сложный.Попробуйте

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

с установленными флагами однострочного режима и случая игнорирования.Я не думаю, что действительно нужно сопоставлять 0 вместо o, но это зависит от вас.Используйте [o0], если необходимо.

2 голосов
/ 30 декабря 2010

Большое спасибо за вашу помощь, ребята, но я нашел решение

(?i:^(?!([\s|\0-9a-zA-Z. ,:/$&#'-]*|p[\s|\.|, ]*|post[\s|\.]*)(o[\s|\.|, ]*|office[\s|\. ]*)(box[\s|\. ]*))[0-9a-zA-Z. ,:/$&#'-]*$)
0 голосов
/ 31 декабря 2010

После удаления символов | в классах персонажей и удаления некоторых неуместных выходов, я попробовал ваше регулярное выражение в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...