在字符串上实现查找/替换算法的简单方法是什么?我想使用定义替换规则的字典来转换字符串。问题是每次更换后,我必须确保后续替换对原始字符串进行操作。例如:
我的字符串是:ABCABCDEFDEF
我的规则是:ABC - > DEF和DEF - > XXX
所以我的结果应该是:DEFDEFXXXXXX 而不是XXXXXXXXXXXX(如果我先应用规则1然后应用规则2,那将是结果。)
答案 0 :(得分:3)
简单方法:
从第一个字符开始,尝试每个键,如果它出现在该位置。
如果找到匹配项,请在替换后替换并继续使用该字符
否则,请继续下一个字符
记住:
歧义:如果您同时将“AB”和“ABC”作为键,则需要确定哪个匹配“ABCD”。通常你想要更长的字符串匹配(否则,它永远不会匹配)
Unicode:首先规范化键和原始字符串。
对于少数几个键来说当然足够了。但是,它是O(N * M),其中N是字符串长度,M是替换数。
改进:
不要线性搜索匹配项;而是使用一个排序的键列表,并对原始字符串中的字符进行二进制搜索,然后搜索下一个字符。确实,只记住第一遍中找到的匹配的位置和键,并进行替换可能是有益的。在第二次通过
对于有大量替换的大字符串,通常最好构建一个新字符串
使用Aho-Corasick进行搜索。这利用了有限的搜索范围(即从关键字列表中获得的知识)来避免探测源字符串的每个字符
答案 1 :(得分:0)
根据您使用的语言,可能会有如此预先设计的功能。如果您使用C#,String.Replace
可能会有所帮助。这可以节省你很多时间。如果您仍在寻找能够在其他字符串中找到模式的算法,那么Horspool - 算法可能正是您所寻找的。 p>
您仍然需要为后续替换实现逻辑以对原始字符串进行操作。但这听起来并不是一件难事。