delphi StringReplace无法替换字符串的所有示例

kpbpu008  于 2022-11-23  发布在  其他
关注(0)|答案(3)|浏览(274)

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”)示例都被替换了。
这是一个错误,还是仅仅是对函数的误导性/不准确的描述?

0tdrvxhp

0tdrvxhp1#

你的例子是正确的,Rob已经解释了原因。下面是它的工作原理。:-)
StringReplace首先找到的是

aaa aaa
^

其在字符串中的索引1处。
它将第一个aa替换为a,因此返回值为

a

然后,它将其位置递增到第一个匹配项之后的右侧,即

aaa aaa
  ^

接下来的字符是a,与replace不匹配。
结果:

aa

源字符串中的位置

aaa aaa
   ^

这是空格字符,不匹配,因此添加到result并向前移动:
结果:

aa

源中的位置

aaa aaa
    ^

我们有一个匹配项,因此我们替换它并在源代码中跳过它。
测试结果

aa a

源中的位置

aaa aaa
      ^

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

aa aa

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

xeufq47z

xeufq47z2#

我使用这个函数将所有OldPattern替换为NewPattern。

function StringReplaceAll(S: string; const OldPattern, NewPattern: string;
  Flags: TReplaceFlags): string;
begin
  Flags := Flags + [rfReplaceAll];
  repeat
    Result := S;
    S := StringReplace(Result, OldPattern, NewPattern, Flags);
  until Result = S;
end;

此函数执行替换并检查是否仍需要替换,如果仍需要,则再次执行替换。

dgtucam1

dgtucam13#

您误解了文档。如果用替换文本替换搜索字符串的一个示例的操作碰巧创建了搜索字符串的另一个示例,则不会再次搜索该替换文本。搜索将从替换文本的末尾继续。
该函数在输入字符串S* 中搜索目标字符串 * 的所有示例。输入字符串没有被修改。要获得预期的输出,它必须在结果中搜索目标字符串的示例,而不仅仅是在输入中。
想象一下,如果搜索字符串和替换字符串完全相同,函数可能永远不会返回,因为每次找到目标并替换它时,它都会找到目标文本的另一个副本。

相关问题