Javascript 拆分字符串,但在拆分数组中保留分隔符
在JavaScript中给定如下字符串Javascript 拆分字符串,但在拆分数组中保留分隔符,javascript,string,split,Javascript,String,Split,在JavaScript中给定如下字符串 var a = 'hello world\n\nbye world\n\nfoo\nbar\n\nfoo\nbaz\n\n'; 我想把它分成这样一个数组 ['hello world', '\n\n', 'bye world', '\n\n', 'foo\nbar', '\n\n', 'foo\nbaz', '\n\n']. 如果输入是var a='hello world\n\n ye world',则结果应该是['hello world','\n\n'
var a = 'hello world\n\nbye world\n\nfoo\nbar\n\nfoo\nbaz\n\n';
我想把它分成这样一个数组
['hello world', '\n\n', 'bye world', '\n\n', 'foo\nbar', '\n\n', 'foo\nbaz', '\n\n'].
如果输入是var a='hello world\n\n ye world'
,则结果应该是['hello world','\n\n','bye world']
换句话说,我希望将“\n\n”周围的字符串拆分为一个数组,以便该数组也包含“\n\n”。在JavaScript中有什么简洁的方法可以做到这一点吗?这里有一行:
str.match(/\n\n|(?:[^\n]|\n(?!\n))+/g)
下面是它的工作原理:
匹配两个连续的换行符\n\n
匹配任意一个或多个字符的任意序列(?:[^\n]|\n(?!\n))+
不是换行符,或[^\n]
换行符,但仅当不后跟另一个换行符时\n(?!\n)
// useful function to quote strings for literal match in regular expressions
RegExp.quote = RegExp.quote || function(str) {
return (str+"").replace(/(?=[.?*+^$[\]\\(){}|-])/g, "\\");
};
// helper function to build the above pattern recursively
function buildRecursivePattern(chars, i) {
var c = RegExp.quote(chars[i]);
if (i < chars.length-1) return "(?:[^" + c + "]|" + c + buildRecursivePattern(chars, i+1) + ")";
else return "(?!" + c + ")";
}
function buildPattern(str) {
return RegExp(RegExp.quote(delimiter) + "|" + buildRecursivePattern(delimiter.match(/[^]/g), 0) + "+", "g");
}
var str = 'hello world\n\nbye world\n\nfoo\nbar\n\nfoo\nbaz\n\n',
delimiter = "\n\n",
parts;
parts = str.match(buildPattern(delimiter))
你想把
'a\n\n\n\nb'
分成什么?@AdamZalcman我试过在字符串上运行一个循环,并使用indexOf
和substr
函数来提取我想要的内容,但我想知道是否有更简洁的方法来解决这个问题。@Cameron这两个方法中的任何一个对我都合适:['a','\n\n',b']['a','\n\n','\n\n','b']对于我的特殊情况,这个输出是无关紧要的,所以我们可以选择哪一个导致更优雅的代码。对于分隔符保留在拆分元素中的类似问题,请参阅:+1000您的regexp mojo功能强大,老师。对于我们这些凡人来说,regexp的分解如何?是否应该build()
调用buildPattern
bebuildRecursivePattern
?
if ("a".split(/(a)/).length !== 3) {
(function() {
var _f = String.prototype.split;
String.prototype.split = function(separator, limit) {
if (separator instanceof RegExp) {
var re = new RegExp(re.source, "g"+(re.ignoreCase?"i":"")+(re.multiline?"m":"")),
match, result = [], counter = 0, lastIndex = 0;
while ((match = re.exec(this)) !== null) {
result.push(this.substr(lastIndex, match.index-lastIndex));
if (match.length > 1) result.push(match[1]);
lastIndex = match.index + match[0].length;
if (++counter === limit) break;
}
result.push(this.substr(lastIndex));
return result;
} else {
return _f.apply(arguments);
}
}
})();
}