Regex для журнала чата WhatsApp - PullRequest
0 голосов
/ 24 января 2019

Я хотел бы вернуть разговор WhatsApp в виде массива. Для этого я использую регулярное выражение, однако я не могу заставить его работать.

Это образец чата, экспортированный через WhatsApp (отредактированный):

6/13/18, 3:40 AM - Messages to this group are now secured with end-to-end encryption. Tap for more info.
6/13/18, 3:40 AM - You created group "Test Group"
6/13/18, 3:42 AM - Zack added Emma
6/13/18, 4:06 AM - Zack added Json
6/13/18, 2:35 PM - Zack: Let's meet tomorrow.
6/15/18, 5:34 PM - Emma: I'll create the Discord server by tonight.
We'll look into making the parser.
7/15/18, 12:05 PM - Zack: Great, I'll add that to our schedule.
7/15/18, 12:05 PM - Json: On our team calander - TCal?
7/15/18, 12:05 PM - Zack: Yes, added on 7/15/18, 12:05 PM.
7/15/18, 12:05 PM - Emma: Are we going JS on this?
7/15/18, 12:05 PM - Json: You bet.
7/15/18, 12:05 PM - Zack: JS is love, JS is life.
7/15/18, 1:46 PM - Emma: Haha.
7/15/18, 4:53 PM - Json: ??

Я пробовал следующее:

/\d{1,2}\/\d{1,2}\/\d{2},\s\d{1,2}:\d{2}\s[AP]M\s-.+\n?/g

, что, как и следовало ожидать, приводит меня к следующим строкам: -

... но если сообщение содержит более 1 строки, оно пропускается.

* 1013 например *

6/15/18, 17:34 - Эмма: Я создам сервер Discord сегодня вечером.
Мы разберемся с парсером.

экстракты:

6/15/18, 17:34 - Эмма: Я создам сервер Discord сегодня вечером.

но я бы хотел извлечь его как:

Эмма: Я создам сервер Discord сегодня вечером.
Мы рассмотрим создание парсера.

1 Ответ

0 голосов
/ 24 января 2019

Вы можете использовать свой (немного укороченный) паттерн в позитивном прогнозе:

s.split(/(?=^\d{1,2}\/\d{1,2}\/\d{2},\s\d{1,2}:\d{2}\s[AP]M)/m).filter(Boolean)

См. Демоверсию regex

Здесь шаблон будет соответствовать каждой начальной позиции строки, за которой сразу следует шаблон \d{1,2}\/\d{1,2}\/\d{2},\s\d{1,2}:\d{2}\s[AP]M).

JS Демо:

var s = "6/13/18, 3:40 AM - Messages to this group are now secured with end-to-end encryption. Tap for more info.\r\n6/13/18, 3:40 AM - You created group \"Test Group\"\r\n6/13/18, 3:42 AM - Zack added Emma\r\n6/13/18, 4:06 AM - Zack added Json\r\n6/13/18, 2:35 PM - Zack: Let's meet tomorrow.\r\n6/15/18, 5:34 PM - Emma: I'll create the Discord server by tonight.\r\nWe'll look into making the parser.\r\n7/15/18, 12:05 PM - Zack: Great, I'll add that to our schedule.\r\n7/15/18, 12:05 PM - Json: On our team calander - TCal?\r\n7/15/18, 12:05 PM - Zack: Yes, added on 7/15/18, 12:05 PM.\r\n7/15/18, 12:05 PM - Emma: Are we going JS on this?\r\n7/15/18, 12:05 PM - Json: You bet.\r\n7/15/18, 12:05 PM - Zack: JS is love, JS is life.\r\n7/15/18, 1:46 PM - Emma: Haha.\r\n7/15/18, 4:53 PM - Json: ??";
console.log(s.split(/(?=^\d{1,2}\/\d{1,2}\/\d{2},\s\d{1,2}:\d{2}\s[AP]M)/m).filter(Boolean));

Вы можете обрезать каждый элемент в результирующем массиве, если добавите .map(x => x.trim()) (или .map(function(x) { return x.trim(); })).

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