Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 替换字符串中匹配模式的算法_String_Algorithm_String Matching - Fatal编程技术网

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

String 替换字符串中匹配模式的算法,string,algorithm,string-matching,String,Algorithm,String Matching,在字符串上实现查找/替换算法的简单方法是什么?我想使用定义替换规则的字典来转换字符串。问题是在每次替换之后,我必须确保后续的替换对原始字符串进行操作。例如: 我的字符串是:ABCABCDEFDEF 我的规则是:ABC->DEF和DEF->XXX 所以我的结果应该是:defxxxxxx 而不是XXXXXXXXXX(如果我先应用规则一,然后再应用规则二,这将是结果)。根据您使用的语言,可能会有如此预先设计的函数String.Replace可能会有所帮助。这会节省你很多时间。如果您仍在寻找可以在其他字

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

我的字符串是:ABCABCDEFDEF

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

所以我的结果应该是:defxxxxxx
而不是XXXXXXXXXX(如果我先应用规则一,然后再应用规则二,这将是结果)。

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

您仍然需要实现后续替换的逻辑,以便对原始字符串进行操作。但这听起来不难做到。

简单的方法:

  • 从第一个字符开始,尝试每个关键点(如果出现在该位置)

  • 如果找到匹配项,请替换并继续替换后的字符

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

请记住:

  • 含糊不清:如果同时使用“AB”和“ABC”作为键,则需要决定哪个键应与“ABCD”匹配。通常您希望较长的字符串匹配(否则,它将永远不会匹配)

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

对于一把钥匙来说,这当然足够了。然而,它是O(N*M),其中N是字符串长度,M是替换的数量


改进:

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

  • 对于具有许多替换项的大型字符串,通常最好构建一个新字符串

  • 用于搜索。这利用了有限的搜索空间(即从关键字列表中获得的知识),以避免探测源字符串的每个字符


对于每个规则,查找与文本匹配的索引。那么应用规则?(我想一定有更快的方法)好吧,在我应用每个规则之后,我的索引都会改变,不是吗?遍历整个字符串一次,并在列表或类似的数据结构中记录所需子字符串的出现情况。然后遍历列表并不断替换!创建一个有限状态机。这可以手动完成(只需要5个状态)或使用(f)lex之类的生成器。是的,我可以使用String.Replace之类的函数,但我不知道如何独立应用每个规则。您可以保存已更改的子字符串的索引。下次为另一个模式遍历字符串时,可以查找子字符串是否已更改。