4

我对正则表达式相当陌生,需要一些帮助。我需要在 Perl 中使用正则表达式过滤一些行。我将把正则表达式传递给另一个函数,所以它需要在一行中完成。

我只想选择包含"too long"且不以开头的行"SKIPPING"

这是我的测试字符串:


跳过这个债券,因为到期太长了 TKIPPing 这个债券,因为到期太长了拍
这个债券,因为到期太长了
你好,这个期限太长了,
这个太长了
你好

正则表达式规则应与“太长”的以下内容匹配:


跳过这个债券,因为 它
到期太久

它应该跳过:

“你好”,因为它不包含“太长”
“跳过这个债券,因为到期时间太长”,因为它不包含“跳过”

4

6 回答 6

11
/^(?!SKIPPING).*too long/
于 2009-08-20T20:56:09.897 回答
10

就个人而言,我会将其作为两个单独的正则表达式来执行,以使其更清晰。

while (<FILE>)
{
  next if /^SKIPPING/;
  next if !/too long/;

   ... do stuff
}
于 2009-08-20T20:53:48.280 回答
3

我怀疑你可能在一个正则表达式之后但是我更喜欢拆分成这样更易读的东西:

use strict;
use warnings;

for my $line ( <DATA> ) {
    next  if $line =~ m/^SKIPPING/;
    next  if $line !~ m/too long/;

    # do something with $line
    chomp $line;
    say "Found: ", $line, ':length=', length( $line );
}

__DATA__
SKIPPING this bond since maturity too long
TKIPPING this bond since maturity too long
SLAPPING this bond since maturity too long
Hello this maturity too long
this is too long
hello there
于 2009-08-20T20:58:56.257 回答
1

使用前瞻;看到这个正则表达式环视的解释

^(?!SKIPPING).*too long
于 2009-08-20T20:55:05.530 回答
0
/^(?<!SKIPPING).*too long$/

匹配您要查找的行。末尾的美元符号使其仅匹配以“太长”结尾的字符串。

希望这可以帮助!

于 2009-08-20T21:03:25.280 回答
-2

使用负面回顾:

(?<!^SKIPPING)too long$
于 2009-08-20T20:52:54.990 回答