我有一个字符串的地图(对的集合)我必须用字符串替换。
例如,如果我有地图{ {"foo", "foo2"}, {"bar", "bar2"} }
字符串"foo barman football bar"
的最终结果应为:"foo2 bar2man foo2tball bar2"
。
已经有很多问题/答案,但没有一个提到这里最大的问题。如果地图有“圆形”替换{ {"foo", "bar"}, {"bar", "foo"} }
结果应该是:"bar fooman bartball foo"
。
另一个问题可能是{ {"foo", "fo"}, {"fo", "f"} }
算法应该只替换一次实例。
很抱歉没有提供SSCCE ......我仍然在寻找如何处理它。
选项1:
按密钥大小(降序)对地图进行排序 - 这将消除包含问题。
然后基于来自经典交换方法的想法。浏览地图并将所有出现的密钥替换为唯一的密钥。在我的情况下,?
无法使用,?1
用于第二个键的第一个键?2
等。
现在在第二次传递时,将?1
替换为值{1,?2
,值为2等。
缺点: 1.您必须有简单的方法来定义与任何键或值不匹配的交换键。 2.似乎性能昂贵
选项2:
创建一般匹配模式((key1|key2|key3...)(.*?))*
。
枚举匹配项并为每个键匹配替换键值。
重新生成结果。
缺点: 1.创建匹配树可能会耗费内存 2.准备一般模式可能很麻烦