Регулярное выражение с опережением

Кажется, я не могу заставить это регулярное выражение работать.

Вход выглядит следующим образом. Это действительно в одной строке, но я вставил разрывы строк после каждого \r\n, чтобы его было легче увидеть, поэтому проверка пробелов не требуется.

01-03\r\n
01-04\r\n
TEXTONE\r\n
STOCKHOLM\r\n
350,00\r\n            ---- 350,00 should be the last value in the first match
12-29\r\n
01-03\r\n
TEXTTWO\r\n
COPENHAGEN\r\n
10,80\r\n

Это может продолжаться еще с 01-31 и 02-01, отмечая еще один новый матч (это даты).

Я хотел бы иметь в общей сложности 2 совпадения для этого ввода. Моя проблема в том, что я не могу понять, как заглянуть вперед и сопоставить начало нового матча (две следующие даты), но не включить эти даты в первый матч. Они должны принадлежать второму матчу.

Это трудно объяснить, но я надеюсь, что кто-то поймет меня. Это то, что я получил до сих пор, но это даже не близко:

(.*?)((?<=\\d{2}-\\d{2}))

Мне нужны следующие совпадения:

1: 01-03\r\n01-04\r\nTEXTONE\r\nSTOCKHOLM\r\n350,00\r\n
2: 12-29\r\n01-03\r\nTEXTTWO\r\nCOPENHAGEN\r\n10,80\r\n

После этого я могу легко разделить столбцы с помощью \r\n.


person Andreas    schedule 04.02.2011    source источник
comment
Вы говорите, что ваша входная строка содержит обратную косую черту r обратную косую черту n, а не символы новой строки? Это кажется довольно странным...   -  person Mark Byers    schedule 05.02.2011


Ответы (3)


Вот еще один вариант, который вы можете попробовать:

(.+?)(?=\d{2}-\d{2}\\r\\n\d{2}-\d{2}|$)

рубуляр

person Mark Byers    schedule 04.02.2011
comment
Вместо этого я пометил это как ответ, поскольку ему не важно количество столбцов или то, что последний должен быть числом, как в регулярном выражении Рубенса. Это сработало на 100% со всеми моими тестовыми данными, которые имели разное количество столбцов, а также странно отформатированную валюту в качестве последнего столбца :) Спасибо! - person Andreas; 05.02.2011

Может ли этот более явный шаблон работать для вас?

(\d{2}-\d{2})\r\n(\d{2}-\d{2})\r\n(.*)\r\n(.*)\r\n(\d+(?:,?\d+))
person Rubens Farias    schedule 04.02.2011
comment
Для этого регулярного выражения требуется точное количество столбцов, а последний должен быть числом. Это было правильно на основе моих тестовых данных, но ответ Марка был точным. Все равно спасибо! - person Andreas; 05.02.2011

Зачем столько работы?

$string = q(01-03\r\n01-04\r\nTEXTONE\r\nSTOCKHOLM\r\n350,00\r\n12-29\r\n01-03\r\nTEXTTWO\r\nCOPENHAGEN\r\n10,80\r\n);
for (split /(?=(?:\d{2}-\d{2}\\r\\n){2})/, $string) {
   print join( "\t", split /\\r\\n/), "\n"
}

Выход:

01-03   01-04   TEXTONE STOCKHOLM       350,00
12-29   01-03   TEXTTWO COPENHAGEN      10,80`
person Community    schedule 05.02.2011