2015-07-19 56 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