Regex, чтобы соответствовать журналу чата WhatsApp - PullRequest
0 голосов
/ 10 мая 2018

Я пытался создать Regex для журнала чата WhatsApp.

До сих пор мне удавалось добиться этого

Нажмите здесь для проверки ссылки

Создавая следующее регулярное выражение:

(?P<datetime>\d{2}\/\d{2}\/\d{4},\s\d(?:\d)?:\d{2} [pa].m.)\s-\s(?P<name>[^:]*):(?P<message>.*)

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

Помощь будет признательна.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вот, пожалуйста:

^
(?P<datetime>\d{2}/\d{2}/\d{4}[^-]+)\s+-\s+
(?P<name>[^:]+):\s+
(?P<message>[\s\S]+?)
(?=^\d{2}|\Z)

См. Измененную демоверсию на regex101.com .


По сути, я добавил якоря, упростил вашу дату и время и вставил [\s\S]+?, что означает: соответствует чему-либо лениво (включая символы новой строки) до следующего условия, которое является предвидением. Взгляд в будущее позволяет удостовериться, что есть либо две другие цифры сразу после новой строки (могут быть затянуты!), Либо самый конец строки.
0 голосов
/ 10 мая 2018

Точка не соответствует символам новой строки, поэтому вы получаете только первую строку.Поведение соответствия механизма регулярных выражений обычно можно изменить с помощью флагов.

На странице regexp101 вы можете нажать на Установить параметры регулярного выражения (флаг рядом с полем ввода регулярного выражения).) и активируйте Одну строку , тогда точка также будет соответствовать \n.

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

...