【问题标题】:Substitute substring within a string bidrectionally [duplicate]双向替换字符串中的子字符串[重复]
【发布时间】:2015-10-08 23:05:23
【问题描述】:

给定一个包含术语 AB 的字符串 M,我想将每个 A 替换为BA 的每个 BM'。天真地尝试将 A 替换为 B,然后将 B 替换为 A 但在这种情况下 M' 仅包含 A。我可以考虑替换条款并记录它们的位置,以免条款再次被替换。当我们只有 A 和 B 要替换时,这很有效。但是,如果我们需要替换超过 2 个术语并且它们的长度不同,那么它就会变得棘手。

所以我想这样做:

  • 我们得到 M 作为输入字符串,R = [(x1, y1), (x2, y2), ... (xn, yn)] 作为要替换的术语,我们替换xi 代表 yi 代表所有 i。
  • 使用 M,将 L = [(M, false)] 初始化为 (string * boolean) 元组的列表,其中 false 表示该字符串未被替换。
  • 搜索 L 的每个成员 L(i) 中出现的 xi,第二项为 false。将 L(i) 划分为 [(pre, false), (xi, false), (post, false)],并映射到 [(pre, false), (yi, true), (post, false)] 其中 pre和 post 是 xi 前后的字符串。展平 L。
  • 重复上述操作,直到 R 用尽。
  • 将 L 的每个元组的第一个元素连接到 M'

有没有更有效的方法?

【问题讨论】:

  • @Amit 你能写一个例子作为答案吗?
  • 你自己试试吧。正则表达式功能强大,但您需要自己了解它的工作原理才能知道何时使用它。
  • 我认为我的问题只是stackoverflow.com/questions/15604140/…的一个更狭窄的案例

标签: string algorithm


【解决方案1】:

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

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。真正的实现必须处理查找字符串的正确转义。

【讨论】:

  • 我猜你错过了理解这个问题。设 M 为“foobar”,A =“foo” B="bar"。结果应该是“barfoo”。一个简单的替换很容易,但这个问题要求双向替换。
  • @xiamx 现在好点了吗? (第一个演示中也是比迪烟)
  • 对不起,这是我的错,我没读好。很高兴知道正则表达式可以做到这一点。如何将其扩展到多对 a 和 b?
  • 这并不难,但我现在做不到。我保证明天给你答复!
【解决方案2】:

另一种方法是用中间临时字符串(符号)替换字符串,然后用它们的原始对应物替换符号。因此转换'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

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 2022-01-07
    • 1970-01-01
    • 2013-05-18
    • 2011-10-10
    • 1970-01-01
    • 2017-07-02
    • 2021-06-17
    • 2012-10-05
    相关资源
    最近更新 更多