2017-05-24 21 views
0

這是我的第一個問題,所以如果我搞砸了,請原諒。我是新來的。 Anywho,最近我一直在設計一個函數,它接受一個字符串和2個子字符串,然後返回兩個子字符串位置的數組,以便稍後使用我正在搜索的子字符串的位置對實際字符串進行子字符串。我希望這是有道理的。在2個或更多子串之間獲取文本

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)的源串(一個或多個)中的位置,並將它們添加到陣列,因爲它是自己的數組。 例如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. 

此外,有沒有一個名字爲這種技術?

回答

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."))

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; 
} 
0

與您的代碼的問題是,「一」([[5,23],[27,49]])的,在你的示例中的第二陣列元件是相對於所述臨時「S」 - 爲第二次調用m()創建的字符串。您必須將值移動「s」-string的截止部分的長度:[[5,23],[27 + 23,49 + 23]]。

但我會推薦使用類似Will P.'s method的東西。

相關問題