替换字符串中匹配模式的算法

时间:2014-06-30 07:08:34

标签: string algorithm string-matching

在字符串上实现查找/替换算法的简单方法是什么?我想使用定义替换规则的字典来转换字符串。问题是每次更换后,我必须确保后续替换对原始字符串进行操作。例如:

我的字符串是:ABCABCDEFDEF

我的规则是:ABC - > DEF和DEF - > XXX

所以我的结果应该是:DEFDEFXXXXXX 而不是XXXXXXXXXXXX(如果我先应用规则1然后应用规则2,那将是结果。)

2 个答案:

答案 0 :(得分:3)

简单方法:

  • 从第一个字符开始,尝试每个键,如果它出现在该位置。

  • 如果找到匹配项,请在替换后替换并继续使用该字符

  • 否则,请继续下一个字符

记住:

  • 歧义:如果您同时将“AB”和“ABC”作为键,则需要确定哪个匹配“ABCD”。通常你想要更长的字符串匹配(否则,它永远不会匹配)

  • Unicode:首先规范化键和原始字符串。

对于少数几个键来说当然足够了。但是,它是O(N * M),其中N是字符串长度,M是替换数。


改进:

  • 不要线性搜索匹配项;而是使用一个排序的键列表,并对原始字符串中的字符进行二进制搜索,然后搜索下一个字符。确实,只记住第一遍中找到的匹配的位置和键,并进行替换可能是有益的。在第二次通过

  • 对于有大量替换的大字符串,通常最好构建一个新字符串

  • 使用Aho-Corasick进行搜索。这利用了有限的搜索范围(即从关键字列表中获得的知识)来避免探测源字符串的每个字符

答案 1 :(得分:0)

根据您使用的语言,可能会有如此预先设计的功能。如果您使用C#,String.Replace可能会有所帮助。这可以节省你很多时间。如果您仍在寻找能够在其他字符串中找到模式的算法,那么Horspool - 算法可能正是您所寻找的。

您仍然需要为后续替换实现逻辑以对原始字符串进行操作。但这听起来并不是一件难事。