我有一个必须在字符串中替换的字符串映射(对的集合)。
例如,如果我有 map{ {"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:
创建一个通用匹配模式say ((key1|key2|key3...)(.*?))*
。枚举匹配项,并为每个键匹配用值替换键。重新生成结果。
缺点: 1. 创建匹配树可能会耗费大量内存 2. 准备通用模式可能很麻烦