从 Delphi 10.3 中的字符串中减去掩码

Subtract a mask from a string in Delphi 10.3

我通过给定的掩码将资源 dll 文件名收集到 TStringList 中。到那时它工作正常。之后我想收集文件名中包含的语言代码。是否有任何 built-in 函数或格式正确的 regexp 来根据掩码获得正确的字符串部分?

示例 1:

掩码:resources_%s.dll

其中一个收集到的文件名:resources_en.dll

语言代码:en

示例 2:

掩码:%s_resources.dll

其中一个收集到的文件名:eng_resources.dll

语言代码:英语

示例 3:

掩码:res-%s.dll

其中一个收集到的文件名:res-en.dll

语言代码:en

一般来说,这个问题在数学上是不可能解决的。

例如,考虑掩码 alpha_%s_beta_%s_gamma 和输出 alpha_cat_beta_beta_dog_gamma.

有可能第一个值为cat,第二个为beta_dog,但也有可能第一个值为cat_beta,第二个为dog。所以必须提供额外的信息。

例如,如果您知道掩码总是恰好包含 %s 的一 (1) 个实例,那么问题就很容易解决。例如(省略所有错误检查):

function GetValueFromMask(const AMask, AText: string): string;
var
  p: Integer;
begin
  p := Pos('%s', AMask);
  Result := Copy(AText, p, 2 + AText.Length - AMask.Length);
end;

当然,您永远不会在生产中使用该代码。您将添加错误检查,确保您处理 AText 不匹配 AMaskAMask 包含零或 >1 %s

但你明白了。