Dephi 7帮助手册中提到了StringReplace...
返回一个字符串,其中一个子字符串被另一个子字符串替换...
如果Flags不包含rfReplaceAll,则StringReplace只会取代S中第一个出现的OldPattern。否则,StringReplace会以NewPattern取代OldPattern的所有实体。
“否则,StringReplace用NewPattern替换OldPattern的所有示例”的语句似乎是一个虚假的语句,因为在下面的示例中,即使我指示函数“用'a'(NewPattern)替换'aa'(OldPattern)的所有示例",“aa”的示例仍然存在!
StringReplace('aaa aaa','aa','a',[rfReplaceAll]);
如果 Delphi 手册是准确的,那么我应该得到“a a”作为最终结果。不幸的是,我得到了“aa aa”。显然不是所有的“OldPattern”(“aa”)示例都被替换了。
这是一个错误,还是仅仅是对函数的误导性/不准确的描述?
3条答案
按热度按时间0tdrvxhp1#
你的例子是正确的,Rob已经解释了原因。下面是它的工作原理。:-)
StringReplace首先找到的是
其在字符串中的索引
1
处。它将第一个
aa
替换为a
,因此返回值为然后,它将其位置递增到第一个匹配项之后的右侧,即
接下来的字符是
a
,与replace不匹配。结果:
源字符串中的位置
这是空格字符,不匹配,因此添加到result并向前移动:
结果:
源中的位置
我们有一个匹配项,因此我们替换它并在源代码中跳过它。
测试结果
源中的位置
没有剩余的匹配项,所以我们只需要将剩余的字符添加到结果中,就完成了。
所以代码按设计工作,文档也是正确的。:-)
xeufq47z2#
我使用这个函数将所有OldPattern替换为NewPattern。
此函数执行替换并检查是否仍需要替换,如果仍需要,则再次执行替换。
dgtucam13#
您误解了文档。如果用替换文本替换搜索字符串的一个示例的操作碰巧创建了搜索字符串的另一个示例,则不会再次搜索该替换文本。搜索将从替换文本的末尾继续。
该函数在输入字符串
S
* 中搜索目标字符串 * 的所有示例。输入字符串没有被修改。要获得预期的输出,它必须在结果中搜索目标字符串的示例,而不仅仅是在输入中。想象一下,如果搜索字符串和替换字符串完全相同,函数可能永远不会返回,因为每次找到目标并替换它时,它都会找到目标文本的另一个副本。