String 在字符串中双向替换子字符串

String 在字符串中双向替换子字符串,string,algorithm,String,Algorithm,给定一个包含术语a和B的字符串M,我想用每个a来代替B,用每个B来代替a来代替M’。天真地,人们会尝试用B替换A,然后用A替换B,但在这种情况下,M'只包含A。我可以考虑替换这些术语,并记录它们的位置,这样这些术语就不会再次被替换。当我们只需要更换A和B时,这就可以工作了。但是如果我们需要替换两个以上的术语,并且它们的长度不同,那么这就变得很棘手了 所以我想这样做: 我们将m作为输入串,r= [(x1,y1),(x2,y2),…(xn,yn)]作为替换项,在这里,我们将席i替换为i, 对于M,

给定一个包含术语a和B的字符串M,我想用每个a来代替B,用每个B来代替a来代替M’。天真地,人们会尝试用B替换A,然后用A替换B,但在这种情况下,M'只包含A。我可以考虑替换这些术语,并记录它们的位置,这样这些术语就不会再次被替换。当我们只需要更换A和B时,这就可以工作了。但是如果我们需要替换两个以上的术语,并且它们的长度不同,那么这就变得很棘手了

所以我想这样做:

  • 我们将m作为输入串,r= [(x1,y1),(x2,y2),…(xn,yn)]作为替换项,在这里,我们将席i替换为i,
  • 对于M,将L=[(M,false)]初始化为(字符串*布尔)元组的列表,其中false表示该字符串未被替换
  • 搜索L的每个成员L席(i),第二项为假。分区L(i)到[(Primo,Falue),(Xi,Falue),(PoST,Falm)],并映射到[(Prue,Falue),(Yi,True),(PoST,Falm)]席席前后的字符串。压扁L
  • 重复上述步骤,直到R耗尽
  • 将L的每个元组的第一个元素连接到M’

有更有效的方法吗?

这里有一个正则表达式解决方案:

var M='foobazbar123foo-match';
变量对={
‘foo’:‘bar’,
'酒吧':'福',
"baz":"quz",,
“否”:“匹配”
};
var re=new RegExp(Object.keys(pairs.join)(“|”),“g”);

警报(M.replace(re,函数(M){返回对[M];}))这里有一个正则表达式解决方案:

var M='foobazbar123foo-match';
变量对={
‘foo’:‘bar’,
'酒吧':'福',
"baz":"quz",,
“否”:“匹配”
};
var re=new RegExp(Object.keys(pairs.join)(“|”),“g”);

警报(M.replace(re,函数(M){返回对[M];}))另一种方法是用中间临时字符串(符号)替换字符串,然后用其原始对应项替换符号。因此,可以通过两个步骤来转换转换
'foo'=>'bar'
,例如,
'foo'=>'\uuuu 1'=>'bar'
。另一个转换
'bar'==>'foo'
将变成
'bar'==>'\uuuuuu 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

另一种方法是用中间临时字符串(符号)替换字符串,然后用其原始对应项替换符号。因此,可以通过两个步骤来转换转换
'foo'=>'bar'
,例如,
'foo'=>'\uuuu 1'=>'bar'
。另一个转换
'bar'==>'foo'
将变成
'bar'==>'\uuuuuu 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

@你能写一个例子作为答案吗?你最好自己试一下。Regex功能强大,但你需要自己知道它是如何工作的,才能知道何时使用它。我想我的问题只是@Amit的一个更狭隘的例子。你能写一个例子作为答案吗?你最好自己试试。Regex功能强大,但你需要自己知道它是如何工作的,才能知道何时使用它。我想我的问题只是一个更狭隘的例子,我想你可能不理解这个问题。设M为“foobar”和A=“foo”B=“bar”。结果应该是“巴福”。简单的替换很容易,但这个问题要求双向替换。@xiamx现在更好了吗?(第一个演示中也是比迪)啊,对不起,这是我的错,我没有读好。很高兴知道regex可以做到这一点。如何将其扩展到多对a和b?这并不难,但我现在无法做到。我答应明天给你答复!我想你不明白这个问题。设M为“foobar”和A=“foo”B=“bar”。结果应该是“巴福”。简单的替换很容易,但这个问题要求双向替换。@xiamx现在更好了吗?(第一个演示中也是比迪)啊,对不起,这是我的错,我没有读好。很高兴知道regex可以做到这一点。如何将其扩展到多对a和b?这并不难,但我现在无法做到。我答应明天给你答复!