Регулярное выражение с нетерпением - PullRequest
3 голосов
/ 05 февраля 2011

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

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

Ответы [ 4 ]

3 голосов
/ 05 февраля 2011

Может ли вам помочь этот более явный шаблон?

(\d{2}-\d{2})\r\n(\d{2}-\d{2})\r\n(.*)\r\n(.*)\r\n(\d+(?:,?\d+))
2 голосов
/ 05 февраля 2011

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

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

Рубулярный

1 голос
/ 05 февраля 2011
/
   \G
   (
      (?:
         [0-9]{2}-[0-9]{2}\r\n
      ){2}
      (?:
         (?! [0-9]{2}-[0-9]{2}\r\n ) [^\n]*\n
      )*
   )
/xg
0 голосов
/ 05 февраля 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`
...