我正在尝试创建一个正则表达式的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.
基本上,时间戳之后可能会有或没有换行符,并且可能有多个换行符的换行符。
答案 0 :(得分:3)
我认为问题在于Javascript的split
如何处理捕获组。解决方案可能只是在您的模式中使用非捕获组。也就是说,而不是:
/\s*(?=(\b\d+:\d+|\*\*\*))/
使用
/\s*(?=(?:\b\d+:\d+|\*\*\*))/
^^
(?:___)
是所谓的非捕获组。
然而,从整体模式来看,实际上并不需要分组。你应该可以使用:
/\s*(?=\b\d+:\d+|\*\*\*)/
而不是\*\*\*
,您可以使用[*]{3}
。这可能更具可读性。 *
不是字符类定义中的元字符,因此不必对其进行转义。 {3}
就是你如何表示“正好3次重复”。