2011-02-04 4 views
3

Я не могу заставить это регулярное выражение работать.Regex with lookahead

Вход выглядит следующим образом. Его действительно в одной строке, но я вставил разрывы строк после каждого \ 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 

После того, что я могу легко отделить столбцы с \ г \ п.

+0

Вы говорите, что ваша входная строка содержит «обратной косой г обратной косой п», а не символы новой строки? Это кажется довольно странным ... –

ответ

2

Вот еще один вариант для вас попробовать:

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

Rubular

+0

Я отметил это как ответ, потому что он не заботится о nr столбцов или что последнее должно быть числом, как с регулярным выражением Рубенса. Это работало на 100% со всеми моими тестовыми данными, которые имели разные столбцы, а также странно отформатированную валюту в качестве последнего столбца :) Спасибо! – Andreas

3

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

(\d{2}-\d{2})\r\n(\d{2}-\d{2})\r\n(.*)\r\n(.*)\r\n(\d+(?:,?\d+)) 
+0

Это прекрасно работает, спасибо! Я люблю SO :) – Andreas

+1

Для этого регулярного выражения требуется точное число столбцов, а последнее - число. Это было правильно, основываясь на моих тестовых данных, но ответ Марк был на месте. В любом случае, спасибо! – Andreas

1
/ 
    \G 
    (
     (?: 
     [0-9]{2}-[0-9]{2}\r\n 
    ){2} 
     (?: 
     (?! [0-9]{2}-[0-9]{2}\r\n) [^\n]*\n 
    )* 
    ) 
/xg 
0

Почему так много работы?

$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`