正则表达式 JavaScript 分割函数

5

我正在尝试创建一个正则表达式的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.

我希望在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." ];

我目前使用的正则表达式是:

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进行分割,因为它们不一致,有时根本没有换行符。

你能帮我写一个正则表达式吗?

非常感谢!

编辑:回复phleet的评论

可能会像这样:

9:30 pm
The user did action A.

He also did action B

10:30 pm Welcome, user John Doe.

基本上,时间戳后可能会有换行符,事件描述可能会有多个换行符。

你能提供一下你所说的那种输入吗?是指没有换行符还是没有空行? - Jamie Wong
1个回答

3

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

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

使用

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

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

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

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

参考资料


小提示

你可以使用[*]{3}代替\*\*\*。这样可能更易读。因为*在字符类定义内不是元字符,所以它不需要转义。而{3}用于表示“恰好重复三次”。

参考资料


1
太棒了,非常感谢!这完全解决了问题。 - Rohan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接