inno-setup - Pascal 脚本计算一个字符串在另一个字符串中出现的次数

标签 inno-setup pascalscript

我想计算 Pascal 脚本中一个字符串在另一个字符串中出现的次数,如下例所示。

我已经看到 Delphi: count number of times a string occurs in another string 的答案,但 Pascal Script 中没有 PosEx 函数。

MyString := 'Hello World!, Hello World!, Hello World!, Hello World!';

如果我数一下HelloWorld在这里出现的次数,结果应该是4。

如果我数一下,(逗号)在这里出现的次数,结果应该是3。

更新

下面的函数可以工作,但是它会再次将给定的字符串复制到一个新的变量中,并删除部分字符串,因此运行速度很慢。

function OccurrencesOfSubString(S, SubStr: String): Integer;
var
  DSStr: String;
begin
  if Pos(SubStr, S) = 0 then
    Exit
  else
    DSStr := S;
  Repeat
    if Pos(SubStr, S) <> 0 then
    Inc(Result);
    Delete(DSStr, Pos(SubStr, DSStr), Length(Copy(DSStr, Pos(SubStr, DSStr), Length(SubStr))));
  Until Pos(SubStr, DSStr) = 0;
end;

最佳答案

您的实现通常是正确的。

需要进行一些优化并删除无用的代码:

  • if Pos(SubStr, S) <> 0 的第二次测试(在 repeat 内)是没有意义的。这始终是真的。您正在测试S ,它已经在函数启动时进行了测试。还有DSStr已在until中进行了测试.
  • 您应该保存Pos(SubStr, DSStr)一个变量不要多次调用它。
  • Length(Copy(DSStr, Pos(SubStr, DSStr), Length(SubStr)))实际上与 Length(SubStr) 相同.
  • 无需复制SDSStr 。您可以直接使用 S 。它是按值参数,因此您无需修改​​用于调用函数的变量。
  • 替换最初的 Pos(SubStr, S) = 0在循环中使用相同的检查来保存一个 Pos打电话。

代码的优化版本:

function OccurrencesOfSubString(S, SubStr: String): Integer;
var
  P: Integer;
begin
  Result := 0;
  repeat
    P := Pos(SubStr, S);
    if P > 0 then
    begin
      Inc(Result);
      Delete(S, P, Length(SubStr));
    end;
  until P = 0;
end;

但实际上使用 Inno Setup StringChange function (Delphi 没有),您不必自己编写任何算法。

function OccurrencesOfSubString(S, SubStr: String): Integer;
begin
  Result := StringChange(S, SubStr, '');
end; 

这是受到 @RobertFrank's answer 的启发至 Delphi: count number of times a string occurs in another string .

同时使用StringChange看起来效率低下(因为它有显着的副作用),但实际上速度更快。可能是因为它是用 Pascal 实现的,而不是用 Pascal Script 实现的。

经过 300 万次调用测试:

OccurrencesOfSubString('Hello World!, Hello World!, Hello World!, Hello World!', 'Hello')
  • StringChange :11秒
  • 我的代码优化版本:49 秒
  • 您的原始代码:99 秒

尽管调用很少,但所有实现都足够好。

关于inno-setup - Pascal 脚本计算一个字符串在另一个字符串中出现的次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39907622/

相关文章:

.net - Inno Setup 卸载程序不会从 GAC 中删除程序集

inno-setup - Inno Setup 语法 - OR, AND

inno-setup - 创新设置: How to show (hide/unhide) password on checkbox checked

inno-setup - Inno Setup Detect 在 TasksList.OnClickCheck 事件中更改了任务/项目

mysql - 如何在 inno setup 中检查 MySQL 连接?

json - Inno 安装程序 : How can I edit and retrieve value from a children section of a JSON file

inno-setup - 如何在传递给函数时在 Inno Setup 中包含单引号?

inno-setup - Inno Setup "return"like command/construct in Code

arrays - 如何在const中定义数组?

image - 将图像添加到 Inno Setup 卸载程序背景