Perl Regex для соответствия только 1 домену - PullRequest
1 голос
/ 12 января 2011

Я пытаюсь создать регулярное выражение, которое соответствует следующему:

part1@domain.com

part1: где part1 - любое 5-значное число из 0-9
part2: [необязательно] где @ domain.com - все домены, кроме @ yahoo.com

пример: 12345@yahoo.com
Я не могу найти, как вставить условное выражение врегулярное выражениеТеперь только мои регулярные выражения соответствуют цифрам + домен.Еще нужно выяснить:

  1. как сопоставить только цифры
  2. условно принимать все домены кроме @ yahoo.com

Код:

#!/usr/bin/perl
use strict;
use warnings;

my $regex1 = '^(\d{5})([@]([a-zA-Z0-9_-]+?\.[a-zA-Z]{2,6})+?)';

while ( my $line = <DATA> ) {
  chomp $line;
  if ($line =~ /$regex1/)
  {
    print "MATCH FOR:\t$line \n";
  }
}

Пример данных:

1234
12345@
12345@tandberg
A12345@tandberg.com
12345
12345@tandberg.com
12345@cisco.com
12345@tandberg.amer.com
12345@tandberg.demo

Ответы [ 2 ]

2 голосов
/ 12 января 2011

Как насчет этого?

\d{5}(?:@(?!yahoo)[a-zA-Z0-9.]+\.[a-zA-Z]{2,3})?

В развернутом виде:

\d{5}            # 5 digits
(?:              # begin a grouping
  @              # literal @ symbol
  (?!yahoo\.com) # don't allow something that matches 'yahoo.com' to match here
  [a-zA-Z0-9.]+  # one or more alphanumerics and periods
  \.             # a literal period
  [a-zA-Z]{2,3}  # 2-3 letters
)                # end grouping
?                # make the previous item (the group) optional

(?!yahoo\.com) - это то, что называется " отрицательное прогнозное утверждение ".

2 голосов
/ 12 января 2011

почему бы просто не сначала проверить yahoo.com и, если вы получили совпадение, перейти к следующей строке:

while ( my $line = <DATA> ) {
  chomp $line;
  next if ($line =~ /yahoo\.com$/);
  if ($line =~ /$regex1/)
  {
    print "MATCH FOR:\t$line \n";
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...