0

我有一个文本文件,如下所示。

Jack       Boy
Jill       Girl
Jam        ????
John       Boy
Michelle   Girl

我写了这个,我打算只匹配包含两个单词而不是 line 的行Jam ????。它不工作。

if ( $line =~ ( /(\w+)\s+(\w+)/ ) && !( m/\?\?\?\?/ ) ) 
4

4 回答 4

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
于 2013-11-07T19:18:21.137 回答
1

这些是仅有的两个选项:两个词还是一个词和????

如果是这样,第一部分/(\w)+\s+(\w+)/就足够了。

\w不匹配?

于 2013-11-07T19:11:32.167 回答
0

我认为无需为您的特定输入匹配元字符:

use warnings;
use strict;

while (<DATA>) {
    print if /(\w+)\s+(\w+)/;
}

__DATA__
Jack       Boy
Jill       Girl
Jam        ????
John       Boy
Michelle   Girl
于 2013-11-07T19:09:18.353 回答
0

以前的答案已经涵盖这不是真正正确的过程,但有时通过正则表达式过滤字符串在单个 if 语句中很有帮助。

你几乎拥有它!它在 if 语句的后半部分缺少匹配的运算符。

if ($line =~ (/(\w+)\s+(\w+)/) && !($line =~ m/\?\?\?\?/))

于 2013-11-07T19:24:02.870 回答