Dephi 7帮助手册中提到了StringReplace ...
返回一个字符串,其出现的一个子字符串被另一个子字符串...
替换如果Flags不包含rfReplaceAll,则StringReplace仅替换S中第一次出现的OldPattern。否则,StringReplace将NewPattern的所有实例替换为NewPattern。
声明,“否则,StringReplace用NewPattern替换OldPattern的所有实例”似乎是BOGUS语句,因为在下面的示例中,即使在我指示函数“替换所有实例”之后,“aa”的实例仍然存在'aa'(OldPattern)带'a'(NewPattern)“!
StringReplace('aaa aaa','aa','a',[rfReplaceAll]);
如果德尔福手册是准确的,那么我应该得到'a a'作为最终结果。不幸的是,我得到'aa aa'。显然,并非所有“OldPattern”('aa')的实例都被替换。
这是一个错误,还是仅仅是对该功能的误导/不准确描述?
答案 0 :(得分:13)
您误解了文档。如果用替换替换搜索字符串的实例的行为恰好创建了搜索字符串的另一个实例,则不会再次搜索它。搜索从替换文本的结尾继续。
该函数在输入字符串S
中搜索目标字符串的所有实例。输入字符串未被修改。要获得预期的输出,它必须在结果中搜索目标字符串的实例,而不仅仅是在输入中。
想象一下,如果搜索和替换字符串是相同的。该函数可能永远不会返回,因为每次找到目标并替换它时,它都会找到目标文本的另一个副本。
答案 1 :(得分:2)
你的例子是正确的,Rob已经解释了原因。不过,这是它的工作原理。 : - )
StringReplace发现的第一件事是
aaa aaa
^
位于字符串中的索引1
。
它将第一个aa
替换为a
,因此返回值为
a
然后在第一场比赛后将其位置增加到右边,即
aaa aaa
^
接下来的字符为a
,与替换字符不匹配。将此字符添加到返回值,然后继续前进
结果:
aa
源字符串中的位置
aaa aaa
^
这是空格字符,并且不匹配,因此它会添加到结果中并向前移动:
结果:
aa
来源
aaa aaa
^
我们有一个匹配,所以我们替换它并在源代码中移过它。现在我们在
结果
aa a
来源
aaa aaa
^
没有剩余的匹配,所以我们只是将其余的字符添加到我们的结果中,我们就完成了。功能结果是
aa aa
因此代码按设计工作,文档正确。 : - )