2015-07-19 33 views
2

給出一個字符串中號包含長期一個,我想代替每個一個一個M'。天真地人會嘗試通過並且隨後通過但在M」只包含這種情況下,替換。我可以考慮更換條款並記錄其位置,以便條款不會再被替換。這隻適用於我們只有A和B來替換。但是如果我們需要替換兩個以上的術語並且它們的長度不同,那麼它會變得棘手。替換子bidrectionally

所以我想這樣做的:

  • 我們給出中號作爲輸入字符串和R = [(X1,Y1),(X2,Y2),...(XN,YN) ]作爲替換條款,我們將i替換爲xi。
  • With M,Initiate L = [(M,false)]成爲(string * boolean)元組的列表,其中false表示該字符串未被替換。
  • 尋找L的每個成員L(i)中xi的出現次數爲第二項假。分區L(i)分成[(pre,false),(xi,false),(post,false)],映射到[(pre,false),(yi,true),(post,false)] where pre帖子是xi前後的字符串。 Flatten L.
  • 重複上述步驟直至R耗盡。
  • 將L的每個元組的第一個元素連接起來,從M'

有沒有更有效的方法呢?

+0

@Amit你能不能寫一個例子作爲答案? – xiamx

+0

你最好自己試試。正則表達式是強大的,但你需要知道它自己的作品是如何使用它的。 –

+0

我想我的問題是,只是http://stackoverflow.com/questions/15604140/replace-multiple-strings-with-multiple-other-strings的更窄的情況下 – xiamx

回答

0

這裏有一個正則表達式的解決方案:

var M = 'foobazbar123foo match'; 
 

 
var pairs = { 
 
    'foo': 'bar', 
 
    'bar': 'foo', 
 
    'baz': 'quz', 
 
    'no': 'match' 
 
}; 
 

 
var re = new RegExp(Object.keys(pairs).join('|'),'g'); 
 

 
alert(M.replace(re, function(m) { return pairs[m]; }));

注:這是一個演示/ POC。一個真正的實現將不得不處理恰當的查找字符串轉義。

+0

我猜你錯過理解的問題。讓M爲「foobar」,A =「foo」,B =「bar」。結果應該是「barfoo」。一個簡單的替換很容易,但這個問題要求雙向替換。 – xiamx

+0

@xiamx現在好嗎? (這是第一次演示中的比迪) – Amit

+0

對不起,這是我的不好,我沒有很好地閱讀。很高興知道正則表達式可以做到這一點。我如何將它擴展到a和b的多個對? – xiamx

0

另一種方法是用中間臨時字符串(符號)替換字符串,然後用原始對象代替符號。所以轉化'foo' => 'bar'可以分兩步進行轉化,如'foo' => '___1' => 'bar'。其他轉型'bar' ==> 'foo'將變成'bar' ==> '___2' ==> 'foo'。這將防止你描述的混淆。對於同樣的例子

樣品Python代碼爲對方的回答如下:

import re 
def substr(string): 
    repdict = {"foo":"bar", "bar":"foo", "baz":"quz", "no":"match"} 
    tmpdict = dict() 
    count = 0 
    for left, right in repdict.items(): 
     tmpleft = "___" + count.__str__() 
     tmpdict[tmpleft] = right 
     count = count + 1 
     tmpright = "___" + count.__str__() 
     tmpdict[tmpright] = left 
     count = count + 1 
     string = re.sub(left, tmpleft, string) 
     string = re.sub(right, tmpright, string) 
    for tmpleft, tmpright in tmpdict.items(): 
     string = re.sub(tmpleft, tmpright, string) 
    print string 

>>> substr("foobazbar123foo match") 
barquzfoo123bar no