Delphi TStringList.IndexOf:IndexOf中的通配符?

Delphi TStringList.IndexOf:IndexOf中的通配符?,delphi,indexof,Delphi,Indexof,我想检索stringlist(从文件加载)中的行号。 Indexof似乎完全匹配。有没有办法用通配符版本的Indexof检索该行?类似于SL.Indexof(“?sometext”)的东西 谢谢 没有内置的方法来搜索通配符。您需要使用第三方库,如正则表达式库。如果您希望匹配字符串的某些部分,而不使用任何花哨的通配符,如您在对另一个答案的注释中所指出的,则可以使用以下简单函数: function FindMatchStr(Strings: TStrings; const SubStr: strin

我想检索stringlist(从文件加载)中的行号。 Indexof似乎完全匹配。有没有办法用通配符版本的Indexof检索该行?类似于SL.Indexof(“?sometext”)的东西


谢谢

没有内置的方法来搜索通配符。您需要使用第三方库,如正则表达式库。

如果您希望匹配字符串的某些部分,而不使用任何花哨的通配符,如您在对另一个答案的注释中所指出的,则可以使用以下简单函数:

function FindMatchStr(Strings: TStrings; const SubStr: string): Integer;
begin    
  for Result := 0 to Strings.Count-1 do
    if ContainsStr(Strings[Result], SubStr) then
      exit;
  Result := -1;
end;
function Util_StrLst_GetLineFromSubstr(iStrlst: TStringList; iSubstr: string): Integer;
begin
  for Result := 0 to iStrlst.Count-1 do
    if (Pos(iSubstr, iStrlst[Result]) > 0) then
      Exit;
  Result := -1;
end;
如果需要不区分大小写的匹配,则可以使用:

function FindMatchText(Strings: TStrings; const SubStr: string): Integer;
begin    
  for Result := 0 to Strings.Count-1 do
    if ContainsText(Strings[Result], SubStr) then
      exit;
  Result := -1;
end;

ContainsStr
ContainsText
StrUtils
RTL单元中定义,并遵循
Str
的标准约定来表示区分大小写的比较,
Text
表示不区分大小写。

调整David Heffernan的响应以用于TStringList,函数可以如下所示:

function FindMatchStr(Strings: TStrings; const SubStr: string): Integer;
begin    
  for Result := 0 to Strings.Count-1 do
    if ContainsStr(Strings[Result], SubStr) then
      exit;
  Result := -1;
end;
function Util_StrLst_GetLineFromSubstr(iStrlst: TStringList; iSubstr: string): Integer;
begin
  for Result := 0 to iStrlst.Count-1 do
    if (Pos(iSubstr, iStrlst[Result]) > 0) then
      Exit;
  Result := -1;
end;

或者使用Delphi中的内置正则表达式支持XE@Zruty:我认为有足够多的人没有使用XE来让你的答案有用(+1)。此外,OP没有提到特定的Delphi版本。我真的不需要通配符。如果indexof能够匹配字符串的某个部分也会很好…@David:我知道:)如果这是一个答案,我也会投票支持你。@martin:如果你不需要通配符,那么你可以使用RTL的Pos函数来测试这行是否包含你要查找的子字符串。当然,你不能使用IndexOf,但必须自己迭代这些行……嗨,大卫,谢谢你的回答!我已经用这种方法解决了它,所以遍历字符串。我认为使用一个能立即返回位置的函数会更好。martin,你看过IndexOf背后的实现吗?忽略stringlist排序时的大小写(这对部分匹配没有帮助)IndexOf内部执行完全相同的操作,迭代所有字符串并进行比较。@David标题已更改,但内容相同。您的答案仍然有效。@johnny,TStrings是更合适的类名@martin,TStrings是非常低级的类,用于非常基本的数组,比如字符串操作。用shell样式的regexp使其负担过重是不正确的。@user759588,问题涉及TStringList,而不仅仅是TStrings的任何实现者。@johnny,IndexOf是TStrings的功能。每个人都使用TStringList,因为TStrings是抽象类。但我仍然认为,如果标题和问题使用相同的词语,那么理解起来会更容易。