将字符串拆分为单词并保留分隔符

Ale*_*lex 1 javascript regex

我想将一个字符串(句子)拆分为单词数组并保留分隔符。


我发现并且目前正在使用这个正则表达式:

[^.!?\s][^.!?]*(?:[.!?](?!['"]?\s|$)[^.!?]*)*[.!?]?['"]?(?=\s|$)

可以在这里找到解释: http: //regex101.com/

这完全按照我想要的方式工作,并且有效地生成了一个像这样的字符串

This is a sentence.

到一个数组

["This", "is", "a", "sentence."]

这里的问题是它不包含空格或换行符。我希望字符串像以前一样被解析为单词,但我也希望相应的空格和/或换行符属于前一个单词

我读过关于积极的前瞻,应该寻找未来的字符(空格和/或换行符),但在提取单词时仍然考虑它们。尽管这可能是解决方案,但我未能实施它。

如果有什么区别的话,我正在使用 JavaScript 和以下代码:

//save the regex -- g modifier to get all matches
var reg =  /[^.!?\s][^.!?]*(?:[.!?](?!['"]?\s|$)[^.!?]*)*[.!?]?['"]?(?=\s|$)/g;

//define variable for holding matches
var matches;
//loop through each match
while(matches = reg.exec(STRING_HERE)){
    //the word without spaces or newlines
    console.log(matches[0]);
}
Run Code Online (Sandbox Code Playgroud)

该代码有效,但正如我所说,它不包含空格和换行符

Ori*_*iol 5

你可以尝试更简单的方法:

str.split(/\b(?!\s)/);
Run Code Online (Sandbox Code Playgroud)

但是,请注意非单词字符(例如句号)将被视为另一个单词:

"This is a sentence.".split(/\b(?!\s)/);
// [ "This ", "is ", "a ", "sentence", "." ]
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您可以使用字符类,其中包含不应开始另一个单词的字符:

str.split(/\b(?![\s.])/);
Run Code Online (Sandbox Code Playgroud)