Regex, чтобы соответствовать чему-либо, пока последовательность пробелов не включает + или - символы на суммы - PullRequest
1 голос
/ 20 марта 2019

У меня есть многострочная строка

https://regex101.com/r/RQP7Kk/3

  __    05.01.19     21:16 TD Ølby, Center      diesel                         299,99             10,39  3115,41

      05.01.19                                Rabat                               299,99             -1,92  -575,98

      26.01.19     18:57 TD Ølby, Center      AdBlue                              38,29              5,91   226,39

      26.01.19                                Rabat                               38,29              -3,00  -114,88

Я пытаюсь извлечь каждое поле

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

, но что-то не так, какой правильный синтаксис?

нужно получить

05.01.19;21:16;TD Ølby, Center;diesel;299,99;10,39;3115,41
05.01.19;Null;Null;Rabat;299,99;-1,92;-575,98
26.01.19,18:57;TD Ølby, Center;AdBlue;38,29;5,91;226,39
26.01.19;Null;Null;Rabat;38,29;-3,00;-114,88

Ответы [ 2 ]

2 голосов
/ 20 марта 2019

Как насчет этого?

/^[^\d]* # starting characters
    (\d{2}\.\d{2}\.\d{2}) # datestamp
    \s+
    (?:  # optional captures
        (\d{2}:\d{2}) # timestamp
        \s+
        ((?:[^\s]+\s)*[^\s]+) # location
        \s+
    )?
    ([^\s]+) # product / Rabat
    \s+
    (-?\d+,\d+) # first number
    \s+
    (-?\d+,\d+) # second number
    \s+
    (-?\d+,\d+) # third number
/gixm
2 голосов
/ 20 марта 2019

Вы можете разделить каждую группу пробелами и использовать этот шаблон регулярных выражений:

[_ ]* ([\d\.]+)[ ]+ (([\d\:]+) ([^ ]+ )([^ ]+ )([^ ]+)[ ]+|[ ]+) ([^ ]+)[ ]+ ([^ ]+)[ ]+ ([^ ]+)[ ]+ ([^ ]+)$

и эту подстановку:

\1;\3;\4\5\6;\7;\8;\9;\10

который приведет вас к такому выводу:

05.01.19;21:16;TD Ølby, Center;diesel;299,99;10,39;3115,41
05.01.19;;;Rabat;299,99;-1,92;-575,98
26.01.19;18:57;TD Ølby, Center;AdBlue;38,29;5,91;226,39
26.01.19;;;Rabat;38,29;-3,00;-114,88

Самая важная часть, может быть, это, вы можете использовать "|"сказать "или" в регулярном выражении.

([^ ]+ )([^ ]+ )([^ ]+)[ ]+|[ ]+)

См. онлайн тестер регулярных выражений здесь: https://regex101.com/r/EJISOh/4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...