获取2个或更多子串之间的文本

时间:2017-05-24 21:33:40

标签: javascript string-matching

这是我的第一个问题,请原谅我,如果我搞砸了。我是新人。 Anywho,最近我一直在设计一个带有一个字符串和两个子串的函数,然后返回两个子串的位置数组,以便稍后我可以使用子串的位置对实际字符串进行子串的处理I' m寻找。我希望这是有道理的。

function m(s,s1,s2,prevTable){
var a = prevTable || []
if (s.indexOf(s1) > -1 && s.indexOf(s2, s.indexOf(s1)) > -1){
    a.push([s.indexOf(s1),s.indexOf(s2, s.indexOf(s1))+s2.length])
    s=s.substring(s.indexOf(s2, s.indexOf(s1)+s2.length))
    console.log(s)
    m(s,s1,s2,a);
}
return a;
}

总而言之,它创建了一个数组(a),在源字符串中找到s1和s2的位置(加上它自己的长度,因此它包含s2),将它们添加到数组中,因为它& #39;自己的数组。 例如a将:a = [[2,5]],删除到找到s2的地方(+ s2.length包括s2),然后用新字符串重复它,除非它找不到s1和s2,在这种情况下它返回一个。

然而,它并不像我预期的那样有用。 运行时:

var s = "Hey. This is pointless. Middle is always neutral. This is not 
pointless."
var a=m(s,"This","pointless.")
for (i=0;i<a.length;i++){
console.log(s.substring(a[i][0],a[i][1]))
}

我得到的结果是:

This is pointless.
dle is always neutral.

当我期待:

This is pointless.
This is not pointless.

此外,这项技术有名称吗?

3 个答案:

答案 0 :(得分:0)

使用正则表达式(MSDN Docs)可以更轻松地完成您要做的事情。

这是一个简单的例子,注意:我把它快速地放在一起,它可能无法完美地处理所有输入。

function splitBetweenTwoStrings(str, s1, s2){
  var reg = new RegExp("("+s1+".*?"+s2+")", "g");
  var result = [];
  var r = null;
  
  //get all instances and push into result array
  while((r=reg.exec(str))){
    result.push(r[1]);
  }
  
  return result;
}

console.log(splitBetweenTwoStrings("Hey. This is pointless. Middle is always neutral. This is not pointless.","This","pointless."))

答案 1 :(得分:0)

你可以通过创建另一种方法来检查索引(我从(这里)[https://stackoverflow.com/a/20968478/7535444]获得帮助),然后循环遍历事件。

var s = "Hey. This is pointless. Middle is always neutral. This is not pointless.";
var results = m(s, "This", "pointless.");

for (var i = 0; i < results.length; i++) {
    console.log(results[i]);
}


function m(s, s1, s2) {
    var s1Occurences = occurences(s, s1);
    var s2Occurences = occurences(s, s2);

    var loopCount = Math.min(s1Occurences.length, s2Occurences.length);

    var results = [];
    for (var i = 0; i < loopCount; i++) {
        results.push(s.substring(s1Occurences[i], s2Occurences[i] + s2.length));
    }
    return results;
}

function occurences(main, sub) {
    var indices = [];
    for(var pos = main.indexOf(sub); pos !== -1; pos = s.indexOf(sub, pos + 1)) {
        indices.push(pos);
    }
    return indices;
}

答案 2 :(得分:0)

代码的问题在于,在您的示例中,&#34; a&#34;的第二个数组元素。 ([[5,23],[27,49]])是相对于为m()的第二次调用创建的临时&#34; s#-string。您必须将值移动到&#34; s&#34; -string的截止部分的长度:[[5,23],[27 + 23,49 + 23]]。

但我建议使用类似Will P.'s method的内容。