正则表达式javascript拆分

Roh*_*han 5 javascript regex split

我正在尝试创建一个正则表达式的javascript拆分,但我完全卡住了.这是我的意见:

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.
Run Code Online (Sandbox Code Playgroud)

我希望split()之后的输出数组是(\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." ];
Run Code Online (Sandbox Code Playgroud)

我目前的正则表达式是:

var split = text.split(/\s*(?=(\b\d+:\d+|\*\*\*))/);
Run Code Online (Sandbox Code Playgroud)

这有效,但有一个问题:时间戳在额外的元素中重复.所以我得到:

["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." ];
Run Code Online (Sandbox Code Playgroud)

我不能分开新行,\n因为它们不一致,有时可能根本没有新行.

你可以帮我解决这个问题吗?

非常感谢!!

编辑:回复phleet

它可能看起来像这样:

9:30 pm
The user did action A.

He also did action B

10:30 pm Welcome, user John Doe.
Run Code Online (Sandbox Code Playgroud)

基本上,时间戳之后可能有也可能没有换行符,并且事件描述可能有多个换行符.

pol*_*nts 3

我认为问题在于 Javascript 如何split处理捕获组。解决方案可能只是在您的模式中使用非捕获组。也就是说,而不是:

/\s*(?=(\b\d+:\d+|\*\*\*))/
Run Code Online (Sandbox Code Playgroud)

使用

/\s*(?=(?:\b\d+:\d+|\*\*\*))/
        ^^
Run Code Online (Sandbox Code Playgroud)

(?:___)就是所谓的非捕获群。

然而,从整体模式来看,实际上并不需要分组。您应该能够使用:

/\s*(?=\b\d+:\d+|\*\*\*)/
Run Code Online (Sandbox Code Playgroud)

参考


小点

相反\*\*\*,您可以使用[*]{3}. 这可能更具可读性。不是*字符类定义中的元字符,因此不必对其进行转义。这{3}就是您表示“恰好 3 次重复”的方式。

参考