2016-06-30 3 views
0

Я стараюсь соответствовать шаблону абзаца, и у меня возникают проблемы.Regex Match Paragraph Pattern

Узор:

[image.gif] 
some words, usually a few lines 

name 

emailaddress<mailto:[email protected]> 

Я попытался соответствие все между gif image и <mailto:, но это происходит несколько раз в файле есть я получить плохой результат.

Я попробовал его с этим

(?<=\[image.gif\].*?(\[image.gif\])).*?(?=<mailto:) 

Есть ли способ использовать Regex, чтобы соответствовать общему расположение абзаца?

+0

Вы тест на '[image.gif \]', которые не происходят в вашем входе образца. Не могли бы вы исправить свой вопрос? – trincot

+0

Slow '(? S) (? <= \ [Image \ .gif \]). *? (? = sln

ответ

1

«Общая схема абзаца» нуждается в более четком определении. Учитывая отсутствие ввода плюс ожидаемый результат, я должен угадать, что вы хотите здесь. Я также предполагаю, что вы примете любой язык. Вот perl, почти наверняка не тот язык, с которым вы знакомы.

вход Принято считать:

do not match this line 
[image.gif] 
some words, usually a few lines 

Bobert McBobson 

emailaddress<mailto:[email protected]> 
don't match this line either 
[image.gif] 
another few words 
on another few lines 

Bobina Robertsdaughter 

emailaddress<mailto:[email protected]> 
this line is also not for matching 

Ожидаемый результат:

[image.gif] 
some words, usually a few lines 

Bobert McBobson 

emailaddress<mailto:[email protected]> 
--- 
[image.gif] 
another few words 
on another few lines 

Bobina Robertsdaughter 

emailaddress<mailto:[email protected]> 

Решение с использованием perl:

#!/usr/bin/perl -n007 

my $sep = ""; 
while (/(\[image\.gif\].*?<mailto:[^>]*>(\r)?\n)/gms) { 
    print $sep . $1; 
    $sep = "---$2\n"; 
} 

perl царь регулярных выражений языков; многие говорили бы, что это все, что нужно. Здесь мы используем опцию -n007, чтобы сообщить ей, чтобы прочитать все содержимое каждого файла и запустить на нем код как переменную по умолчанию.

$sep начинает пустым, потому что нечего отделять до второго матча.

Затем мы выполняем цикл по каждому блоку текста, который соответствует регулярному выражению:

  • соответствует буквальному [image.gif]
  • затем сопоставляет, как мало содержания после этого как можно
  • затем буквального <mailto: и продолжается до тех пор, следующий >
  • затем фиксирует разрыв строки (включая дополнительную поддержку для окончаний линии DOS)
  • (see full regex explanation and example at regex101)

Затем мы печатаем совпадение и, наконец, устанавливаем разделитель на три штриха и прерывание строки (при необходимости добавляются линии линии DOS).

Теперь вы можете запустить его:

$ perl answer.pl input.txt 
[image.gif] 
some words, usually a few lines 

Bobert McBobson 

emailaddress<mailto:[email protected]> 
--- 
[image.gif] 
another few words 
on another few lines 

Bobina Robertsdaughter 

emailaddress<mailto:[email protected]>