我想在一个单词数组中分割一个字符串(句子)并保留分隔符。
我发现并且我目前正在使用此正则表达式:
[^.!?\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]);
}
代码有效,但正如我所说,不包含空格和换行符。
答案 0 :(得分:4)
哟可以尝试更简单的事情:
str.split(/\b(?!\s)/);
但是,请注意非单词字符(例如句号)将被视为另一个单词:
"This is a sentence.".split(/\b(?!\s)/);
// [ "This ", "is ", "a ", "sentence", "." ]
要解决这个问题,你可以使用一个不应该从另一个单词开始的字符的字符类:
str.split(/\b(?![\s.])/);
答案 1 :(得分:1)
function split_string(str){
var arr = str.split(" ");
var last_i = arr.length - 1;
for(var i=0; i<last_i; i++){
arr[i]+=" ";
}
return arr;
}
答案 2 :(得分:0)
可能就是这么简单:
var sentence = 'This is a sentence.';
sentence = sentence.split(' ').join(' ||');
sentence = sentence.split('\n').join('\n||');
var matches = sentence.split('||');
请注意,我使用2个管道作为分隔符,但当然,只要它是唯一的,您就可以使用任何东西。
另请注意,我只将\ n拆分为换行符,但您可以添加\ r \ n或其他任何想要拆分的内容。