Perl, любая совпадающая строка после шаблона

Я пытаюсь сопоставить, существует ли какая-либо строка после определенного шаблона. Шаблон - это «шаблон», «что-то среднее» «[после]». без учета регистра.

e.g

pattern 1 [after] ABC
pattern 2 [after] 123 abc DEX
pattern 3 [after] 
pattern 12345123 [after]
pattern @ASd#98 @_90sd [after] xyz dec
[after] 4 pattern

Итак, результат, который я хотел бы получить,

pattern 1 [after] ABC
pattern 2 [after] 123 abc DEX
pattern @ASd#98 @_90sd [after] xyz dec

Он начинается с «шаблон» и заканчивается «[после], все, что находится между ними, также принимается.

У меня возникают трудности с включением разделителей [] и если строка существует вместе.

Я пробовал, самое близкое, что я получил, совпадает

m/pattern/ ../ \[after]/

pattern 1 [after] ABC
pattern 2 [after] 123 ABC DEX
pattern 3 [after] 
pattern 12345123 [after]
pattern @ASd#98 @_90sd [after] xyz dec

Но мне не нужен 3-й или 4-й шаблон, поскольку он не содержит цифр или символов после «[после]».

Спасибо


person user1539348    schedule 27.08.2012    source источник
comment
Извините, но я не могу понять ваш вопрос. Даже регулярное выражение, которое вы показываете, содержит несколько косых черт и не будет компилироваться, и неясно, показываете ли вы буквальные данные или какой-то псевдоязык. Пожалуйста, покажите реальные данные и примеры того, что вам нужно, чтобы сопоставить или отклонить   -  person Borodin    schedule 27.08.2012
comment
Я не уверен, почему регулярное выражение не скомпилировалось для вас, оно скомпилировало и запустило руны для меня. Несколько косых черт с .. — это регулярное выражение Perl, которое включает все, что находится между двумя шаблонами. Что неясно, пожалуйста, скажите мне, я постараюсь разобраться в этом.   -  person user1539348    schedule 28.08.2012


Ответы (3)


Вот код, который я использовал для проверки вашего ввода (который я только что добавил и передал в скрипт)

#!/usr/bin/perl

while(<>)
{
    print if (/^pattern.*\[after\]\s*\S+/);
}

Итак, чтобы сломать это для вас:

/^pattern : соответствует любой строке, начинающейся с «шаблона».

.*\[after\] : соответствует любым символам, за которыми следует "[после]"

\s*\S+ : соответствует 0 или более пробельным символам, за которыми следует один или несколько непробельных символов

Это должно дать вам достаточно для работы, чтобы настроить его по своему усмотрению.

person Ted B    schedule 27.08.2012
comment
Спасибо за подробное объяснение! - person user1539348; 29.08.2012

Код:

$str = 'pattern 2 [after] 123 abc DEX';

if ($str =~ m/^pattern\s+(\d+)\s+\[after\]\s+(.+)/) {
  print "$1\t$2\n";
} else {
  print "(no match)\n";
}

Выход:

2   123 abc DEX

Протестируйте этот код здесь.

person Ωmega    schedule 27.08.2012

Это то, что вы хотите:

/pattern [0-9] \[after\](?= .)/s

or

/pattern [0-9] \[after\] ./s
person ikegami    schedule 27.08.2012