Регулярное выражение JavaScript разделяется

Я пытаюсь создать разделение 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.

В основном, там может, или может не быть новая строка после метки времени, и может быть несколько новых строк для описания события.

5
задан Gilberto Torrezan 6 November 2014 в 19:08
поделиться

1 ответ

Я думаю, что проблема в том, как Javascript split обрабатывает группы захвата. Решением может быть просто использование не захватывающей группы в вашем шаблоне. То есть, вместо:

/\s*(?=(\b\d+:\d+|\*\*\*))/

Use

/\s*(?=(?:\b\d+:\d+|\*\*\*))/
        ^^

The (?:___) - это то, что называется не захватывающей группой.

Однако, если посмотреть на шаблон в целом, то группировка на самом деле не нужна. Вы можете просто использовать:

/\s*(?=\b\d+:\d+|\*\*\*)/

References


Незначительный момент

Вместо \*\*\*\* вы можете использовать [*]{3}. Это может быть более читабельным. * не является метасимволом внутри определения класса символов, поэтому его не нужно экранировать. {3} - это способ обозначить "ровно 3 повторения".

Ссылки

3
ответ дан 15 December 2019 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: