Как я могу объединить положительное и отрицательное условие в регулярном выражении? - PullRequest
4 голосов
/ 21 августа 2009

Я довольно плохо знаком с регулярными выражениями и мне нужна помощь. Мне нужно отфильтровать некоторые строки с помощью регулярных выражений в Perl. Я собираюсь передать регулярное выражение в другую функцию, поэтому это нужно сделать в одной строке.

Я хочу выбрать только те строки, которые содержат "too long" и не начинаются с "SKIPPING"

Вот мои тестовые строки:

Пропуск этой облигации с момента погашения слишком долго
ПЕРЕКРЫВАЯ эту облигацию с момента погашения слишком долго
ОТКРЫВАЯ эту облигацию с момента погашения слишком долго
Здравствуйте, эта зрелость слишком долго
это слишком долго
привет там

Правило регулярных выражений должно соответствовать следующему на «слишком длинном»:

Пропуск этой облигации с момента погашения слишком долго
ОТКРЫВАЯ эту облигацию с момента погашения слишком долго
Здравствуйте, эта зрелость слишком долго
это слишком долго

и следует пропустить:

«Привет!», Потому что он не содержит «слишком долго» * ​​1030 * «Пропуск этой облигации с момента погашения слишком долго», потому что она содержит «Пропуск»

Ответы [ 6 ]

11 голосов
/ 21 августа 2009
/^(?!SKIPPING).*too long/
10 голосов
/ 21 августа 2009

Лично я бы сделал это как два отдельных регулярных выражения, чтобы было понятнее.

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

   ... do stuff
}
3 голосов
/ 21 августа 2009

Я подозреваю, что вы, возможно, после одного регулярного выражения, однако я предпочитаю разделить на что-то более читабельное, как это:

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
1 голос
/ 21 августа 2009

Используйте оглядку; см. это объяснение регулярного выражения .

^(?!SKIPPING).*too long
0 голосов
/ 21 августа 2009
/^(?<!SKIPPING).*too long$/

Соответствует линиям, которые вы ищете. Знак доллара в конце заставляет его совпадать только со строками, оканчивающимися на «слишком длинный».

Надеюсь, это поможет!

0 голосов
/ 21 августа 2009

Использование негативного вида сзади:

(?<!^SKIPPING)too long$
...