我正在尝试创建一个与以下内容匹配的正则表达式:
part1@domain.com
part1:其中part1是0-9的任意5位数字 第2部分:[可选]其中@ domain.com是除@ yahoo.com之外的所有域
示例:12345@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
答案 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”。