2014-09-26 3 views
4

Учитывая следующий текст, какое регулярное выражение PCRE вы использовали бы для выделения частей, выделенных жирным шрифтом?Многострочное, разнообразно жадное, регулярное выражение

 
00:20314 lorem ipsum 
    want this 
    kryptonite 

00:02314 quux 
    padding 
    dont want this 

00:03124 foo 
    neither this 

00:01324 foo 
    but we want this 
    stalagmite 

00:02134 tralala 
    not this 

00:03124 bar foo 
    and we want this 
    kryptonite but not this(!) 

00:02134 foo bar 
    and not this either 

00:dolor sit amet 
    EOF 

IOW, мы хотим извлечь разделы, которые начинаются в регулярных выражениях условий, с "^ 0", а в конце "(криптонит | сталагмит)".

Быстро перемалывался, чтобы найти трещину. ТИА!

+0

Несколько способов сделать это. Могут ли разделители быть в теле? – sln

+0

Единственное, что ограничивает это, не требует никакого другого '^ 0' в теле. – sln

ответ

-1

^(00:. * (Криптонит | сталагмит)) с s модификатор

+0

Просто не соответствует ожидаемому результату – HamZa

3

Это выглядит, как он работает.

# (?ms)^0(?:(?!(?:^0|kryptonite|stalagmite)).)*(kryptonite|stalagmite) 

(?ms) 
^ 0 
(?: 
     (?! 
      (?:^0 | kryptonite | stalagmite) 
    ) 
     . 
)* 
(kryptonite | stalagmite) 
+0

Такая же концепция, но вы также включаете ключевые слова. Nice =) – hwnd

+0

Ключевое слово, вероятно, не нужно. Твоя лучшая. – sln

+0

Еще, думаю, одинаково =) (+1) – hwnd

2

Я считаю, что это будет наиболее эффективным:

^0(?:\R(?!\R)|.)*?\b(?:kryptonite|stalagmite)\b 

Demo


Очевидно, что мы начнем с ^0 и затем заканчиваются либо kryptonite или stalagmite (в не-захвата группа, для этого), окруженная \b word boundaries.

(?:\R(?!\R)|.)*? - интересная деталь, поэтому давайте сломаем ее. Одной из ключевых концепций является PCRE \R newline sequence.

(?:  (?# start non-capturing group for repetition) 
    \R  (?# match a newline character) 
    (?!\R) (?# not followed by another newline) 
|  (?# OR) 
    .  (?# match any character, except newline) 
)*?  (?# lazily repeat this group) 
+0

Вам нужно добавить '$' к вашему выражению – HamZa

+1

@HamZa, я так не верю: '00: 03124 bar foo, и мы хотим этот криптонит, но не этот (!)' – Sam

+0

ok, я неправильно понял требования. Виноват... – HamZa

Смежные вопросы