4

Dephi 7 帮助手册中提到了 StringReplace ......

返回一个字符串,其中一个子字符串被另一个子字符串替换...

如果 Flags 不包含 rfReplaceAll,则 StringReplace 仅替换 S 中第一次出现的 OldPattern。否则,StringReplace 将所有 OldPattern 实例替换为 NewPattern。

“否则,StringReplace 用 NewPattern 替换所有 OldPattern 实例”的语句似乎是一个 BOGUS 语句,因为在下面的示例中,即使在我指示函数“替换 'aa' 的所有实例之后,“aa”的实例仍然存在(OldPattern) 与 'a' (NewPattern)"!

StringReplace('aaa aaa','aa','a',[rfReplaceAll]);

如果 Delphi 手册是准确的,那么我应该得到“a a”作为最终结果。不幸的是,我得到'aaaa'。显然,并非所有“OldPattern”('aa')实例都被替换了。

这是一个错误,还是仅仅是对该功能的误导/不准确描述?

4

2 回答 2

14

您误解了文档。如果用替换替换搜索字符串的实例的行为恰好创建了搜索字符串的另一个实例,则不会再次搜索它。搜索从替换文本的末尾继续。

该函数在输入字符串中S搜索目标字符串的所有实例。输入字符串未修改。要获得您期望的输出,它必须在结果中搜索目标字符串的实例,而不仅仅是在输入中。

想象一下,如果搜索字符串和替换字符串相同。该函数可能永远不会返回,因为每次它找到目标并替换它时,它都会找到目标文本的另一个副本。

于 2013-07-12T03:40:21.793 回答
3

您的示例是正确的,Rob 已经解释了原因。不过,这是它的工作原理。:-)

StringReplace 发现的第一件事是

aaa aaa
^

它位于1字符串中的索引处。

它将第一个替换为aaa因此返回值为

a

然后它在第一次匹配后将其位置增加,即

aaa aaa
  ^

下一个字符是a,与替换不匹配。将此字符添加到返回值中,然后继续前进

结果:

aa

源字符串中的位置

aaa aaa
   ^

这是空格字符,不匹配,所以它添加到结果并向前移动:

结果:

aa 

源中的位置

aaa aaa
    ^

我们有一个匹配项,所以我们替换它并在源中移过它。现在我们在

结果

aa a

源中的位置

aaa aaa
      ^

没有剩余的匹配项,所以我们只需将其余字符添加到我们的结果中,我们就完成了。函数结果是

aa aa

所以代码按设计工作,文档是正确的。:-)

于 2013-07-12T03:17:01.603 回答