我有一个文本文件,如下所示。
Jack Boy
Jill Girl
Jam ????
John Boy
Michelle Girl
我写过这篇文章,我打算只匹配包含两个单词而不是行Jam ????
的行。它不起作用。
if ( $line =~ ( /(\w+)\s+(\w+)/ ) && !( m/\?\?\?\?/ ) )
答案 0 :(得分:2)
如果您还处理数据,那么正则表达式就是错误的工具。
您应该简单地将每一行拆分为字段,并检查第二个字段是否只包含问号。
喜欢这个
use strict;
use warnings;
while (my $line = <DATA>) {
my @fields = split ' ', $line;
next unless $fields[1] =~ /[^?]/;
print $line;
}
__DATA__
Jack Boy
Jill Girl
Jam ????
John Boy
Michelle Girl
<强>输出强>
Jack Boy
Jill Girl
John Boy
Michelle Girl
答案 1 :(得分:1)
这些只是两个选项:两个单词或一个单词????
?
如果是这样,第一部分/(\w)+\s+(\w+)/
就足够了。
\w
与?
不符。
答案 2 :(得分:0)
我认为没有必要为您的特定输入匹配元字符:
use warnings;
use strict;
while (<DATA>) {
print if /(\w+)\s+(\w+)/;
}
__DATA__
Jack Boy
Jill Girl
Jam ????
John Boy
Michelle Girl
答案 3 :(得分:0)
之前的答案已经涵盖了这不是真正正确的过程,但有时通过正则表达式过滤字符串在单个if语句中很有用。
你几乎拥有它!它在if语句的后半部分缺少匹配的运算符。
if ($line =~ (/(\w+)\s+(\w+)/) && !($line =~ m/\?\?\?\?/))