我知道split可以获取第二个参数作为限制,但这不是我想要的。而且我知道可以通过使用实心字符串定界符再次拆分和合并来完成此操作。

问题是定界符是一个正则表达式,我不知道匹配的模式的确切长度。

考虑以下字符串:

this is title
--------------------------
rest is body! even if there is some dashes.!
--------
---------------------
it should not counted as a separated part!


通过使用此:

str.split(/---*\n/);


我会得到:

[
  'this is title',
  'rest is body! even if there is some dashes.!',
  '',
  'it should not counted as a separated part!'
]


这就是我想要成为的:(如果我想按第一次出现的情况进行拆分)

[
  'this is title',
  'rest is body! even if there is some dashes.!\n--------\n---------------------\nit should not counted as a separated part!'
]


该解决方案是我目前拥有的,但这仅是第一次出现。

function split(str, regex) {
    var match = str.match(regex);
    return [str.substr(0, match.index), str.substr(match.index+match[0].length)];
}


有什么主意如何泛化任何数字n在正则表达式的第n次出现时拆分字符串的解决方案?

最佳答案

var str= "this-----that---these------those";
var N= 2;
var regex= new RegExp( "^((?:[\\s\\S]*?---*){"+(N-1)+"}[\\s\\S]*?)---*([\\s\\S]*)$" );
var result= regex.exec(str).slice(1,3);
console.log(result);


输出:

["this-----that", "these------those"]


jsFiddle
具有以下功能的选项:

var generateRegExp= function (N) {
    return new RegExp( "^((?:[\\s\\S]*?---*){"+(N-1)+"}[\\s\\S]*?)---*([\\s\\S]*)$" );
};

var getSlice= function(str, regexGenerator, N) {
    return regexGenerator(N).exec(str).slice(1,3);
};

var str= "this-----that---these------those";
var N= 2;
var result= getSlice(str, generateRegExp, N);
console.log(result);


jsFiddle

具有功能2的选件:

var getSlice= function(str, regex, N) {
    var re= new RegExp( "^((?:[\\s\\S]*?"+regex+"){"+(N-1)+"}[\\s\\S]*?)"+regex+"([\\s\\S]*)$" );
    return re.exec(str).slice(1,3);
};

var str= "this-----that---these------those";
var N= 3;
var result= getSlice(str, "---*", N);
console.log(result);


jsFiddle

10-04 13:18