2014-12-18 2 views
1

Я пытаюсь совместить с регулярным выражением в perl различные части текста, которые не находятся в одной строке.regex maching после новой строки в perl

У меня есть файл размером 200 Мб приблиз со всех случаях, подобных следующему примеру:

rewfww

vfresrgt

rter

*** BLOCK 049 Aeee/Под ред "ewewew" U 141202 0206

BLAH1

BLAH2

END

и я хочу, чтобы извлечь все, что находится в той же строке после "***" в $ 1, BLAH1 в $ 2 и BLAH2 в $ 3.

я попытался следующие без успеха:

открытого (архив, "C: /Users/g/Desktop/blahs.txt") или умереть "умереть \ п";

while(< archive>){ 
    if($_ =~ /^\*\*\*(.*)\n(.*)/s){ 
     print $1; 
     print $2; 
    } 
} 

Еще одна сложность: я не знаю, сколько BLAH в каждом случае. Возможно, в одном случае есть только BLAH1, другой случай с BLAH1, BLAH2 и BLAH3 и т. Д. Единственное, что обязательно - это окончательный «КОНЕЦ», который отделяет случаи.

С уважением

ответ

1
\*\*\*([^\n]*)\n|(?!^)\G\s*(?!\bEND\b)([^\n]+) 

Попробуйте this.See демо.

https://regex101.com/r/vN3sH3/17

+0

perfect, thats, что я хочу, но где я помещаю эту вещь в код, который я разместил? –

+0

@GuidoPujadas сделал эту работу – vks

0

Как насчет:

#!/usr/bin/perl 
use strict; 
use warnings; 

open(my $archive, '<', "C:/Users/g/Desktop/blahs.txt") or die "die: $!"; 
while(<$archive>){ 
    if (/^\*{3}/ .. /END/) { 
     s/^\*{3}//; 
     print unless /END/; 
    } 
} 
0

Насколько я понимаю ваш вопрос следующие работы для меня. Пожалуйста, обновите или сообщите нам обратную связь, если вы ищете что-то более или менее строгое (или укажите любые ошибки!).

^(\*{3}.*\n{2})(([a-zA-Z])*([0-9]*)\n{2})*(END)$

^(\*{3}\n{2}) - Найти линию, состоящую из трех * с последующими двумя символами новой строки - Вы могли бы повторить это, добавив * после последней закрывающей скобки, если вы хотите/нужно проверить «ложный» старт. Хотя похоже, что до этого у вас могут быть данные в файле, но это начало данных, которые вам действительно нужны/хотят захватить.

(([a-zA-Z])*([0-9]*)\n{2})* -Полученные символы слова, за которыми следует число (или цифры, если ваше число BLAH> 9), а также проверьте наличие двух конечных пробелов. * В конце означает, что это может повторить ноль или более раз, что объясняет случай, когда у вас нет данных. Если вы хотите сбой, если нет использования данных? вместо * означает, что он должен повторяться 1 или более раз. Этот сегмент предполагает, что вы хотите проверить данные в формате word + number.Если это не так, эта часть может быть легко изменен, чтобы принять более широкий диапазон данных - дайте мне знать, если вы хотите/нужно более или менее строгий случай

(END)$ - Регулярное выражение заканчивается последовательностью «END». Если это разрешено для продолжения данных, и вы просто хотите остановить захват в этот момент, не включайте $

У меня нет разрешений для публикации фотографий, но отличный сайт для проверки и просмотра визуального представления вашего regex imo is https://www.debuggex.com/

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

  • Нет связанных вопросов^_^