我想将一个字符串(句子)拆分为单词数组并保留分隔符。
我发现并且目前正在使用这个正则表达式:
[^.!?\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)
该代码有效,但正如我所说,它不包含空格和换行符。
你可以尝试更简单的方法:
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)