Я пытаюсь создать разделение JavaScript Regex, но я полностью застреваю. Вот мой вход:
9:30 pm
The user did action A.
10:30 pm
Welcome, user John Doe.
***This is a comment
11:30 am
This is some more input.
Я хочу, чтобы выходной массив после разделения () был (я удалил \n
для удобочитаемости):
["9:30 pm The user did action A.", "10:30 pm Welcome, user John Doe.", "***This is a comment", "11:30 am This is some more input." ];
Мое текущее регулярное выражение:
var split = text.split(/\s*(?=(\b\d+:\d+|\*\*\*))/);
Это работает, но существует одна проблема: метки времени повторяются в дополнительных элементах. Таким образом, я добираюсь:
["9:30", "9:30 pm The user did action A.", "10:30", "10:30 pm Welcome, user John Doe.", "***This is a comment", "11:30", "11:30 am This is some more input." ];
Я не могу разделить на новых строках \n
потому что они не последовательны, и иногда не может быть никаких новых строк вообще.
Вы могли выручить меня с Regex для этого?
Большое спасибо!!
Править: в ответ на phleet
Это могло быть похожим на это:
9:30 pm
The user did action A.
He also did action B
10:30 pm Welcome, user John Doe.
В основном, там может, или может не быть новая строка после метки времени, и может быть несколько новых строк для описания события.
Я думаю, что проблема в том, как Javascript split
обрабатывает группы захвата. Решением может быть просто использование не захватывающей группы в вашем шаблоне. То есть, вместо:
/\s*(?=(\b\d+:\d+|\*\*\*))/
Use
/\s*(?=(?:\b\d+:\d+|\*\*\*))/
^^
The (?:___)
- это то, что называется не захватывающей группой.
Однако, если посмотреть на шаблон в целом, то группировка на самом деле не нужна. Вы можете просто использовать:
/\s*(?=\b\d+:\d+|\*\*\*)/
Вместо \*\*\*\*
вы можете использовать [*]{3}
. Это может быть более читабельным. *
не является метасимволом внутри определения класса символов, поэтому его не нужно экранировать. {3}
- это способ обозначить "ровно 3 повторения".