多字符串全文匹配替换算法 如何做
多字符串全文匹配替换算法 怎么做
目前用的
stringreplace
在替换一条时很好用,但要有多条的话,
for i:=0 to xx do
begin
stringreplace....
end;
发现在要匹配的子串很多,比如说上万 十万之类。会特别慢。 用fastreplace也不理想。 因为每替换一次就要把全文扫一变。每个子串扫一次,子串多了会特别慢。
貌似有个AC 叫多模式匹配 ??自己水平有限,没法实现。求大侠给点示例代码实现快速超多子串替换。。。思路也可以~~~
------解决方案--------------------
delphi中,也有正则表达式控件的,对字串匹配,它的算效率应该可以
其中之一
http://www.regular-expressions.info/delphi.html
你可试一下
------解决方案--------------------
查找的数量较少的时候还是用正则吧,如果一定要自己写的话
最简单的方法是自己遍历:
目前用的
stringreplace
在替换一条时很好用,但要有多条的话,
for i:=0 to xx do
begin
stringreplace....
end;
发现在要匹配的子串很多,比如说上万 十万之类。会特别慢。 用fastreplace也不理想。 因为每替换一次就要把全文扫一变。每个子串扫一次,子串多了会特别慢。
貌似有个AC 叫多模式匹配 ??自己水平有限,没法实现。求大侠给点示例代码实现快速超多子串替换。。。思路也可以~~~
------解决方案--------------------
delphi中,也有正则表达式控件的,对字串匹配,它的算效率应该可以
其中之一
http://www.regular-expressions.info/delphi.html
你可试一下
------解决方案--------------------
查找的数量较少的时候还是用正则吧,如果一定要自己写的话
最简单的方法是自己遍历:
- Delphi(Pascal) code
//srcStr:原始字符串 //targetStr:替换后的结果 //fundStrArray:需要搜索的子串数组 //replaceStrArray:对应的需要替换成为的字串数组 srcIndex:= 1; targetStr:= ""; while srcIndex <= length(srcStr) do begin replaced:= false; for i:=0 to length(fundStrArray)-1 begin if copy(srcStr,srcIndex, length(fundStrArray[i]))= fundStrArray[i] then begin targetStr:= targetStr+replaceStrArray[i]; replaced:= true; srcIndex:= srcIndex+length(fundStrArray[i]); break; end ; end; if not replaced then targetStr:= targetStr+copy(srcStr,srcIndex,1); end;
------解决方案--------------------
如果最短的子串比较长,最好是子串一样长。
我的办法就是用哈希表了,把子串头n(应该3个以上,最好和最短子串一样长)个字节对应到一个数量远大于子串数的哈希表里。
然后用一个n个字节的窗口来对要查找的字符串求哈希函数值。
然后你应该会了吧。