Perl Regex只匹配1个域名

时间:2011-01-12 05:14:17

标签: regex perl dns match

我正在尝试创建一个与以下内容匹配的正则表达式:

  

part1@domain.com

part1:其中part1是0-9的任意5位数字 第2部分:[可选]其中@ domain.com是除@ yahoo.com之外的所有域

示例:12345@yahoo.com
我无法找到如何在正则表达式中插入条件。现在只有我的正则表达式匹配数字+域。还需要弄明白:

  1. 如何仅匹配数字
  2. 有条件接受除@ yahoo.com以外的所有域名
  3. 代码:

    #!/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 个答案:

答案 0 :(得分:2)

为什么不首先检查yahoo.com,如果你得到一个匹配,请转到下一行:

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

答案 1 :(得分:2)

这个怎么样?

\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)就是所谓的“negative lookahead assertion”。