Regex 正则表达式仅在Delphi应用程序中使用时返回第一项

Regex 正则表达式仅在Delphi应用程序中使用时返回第一项,regex,delphi,Regex,Delphi,在一个在线正则表达式测试仪中,这个正则表达式的行为和我预期的一样,它匹配以Xtal开头的句子,并且在输入Declare MyDeclaration时匹配。当我尝试在我的Delph应用程序中使用它时,它只会检测到第一项,即Xtal 这是我的密码 function GetItems(SourceCode: String; ItemCategory: TItemCategory): String; Overload; Var Regex: TRegEx; Match: TMatch;

在一个在线正则表达式测试仪中,这个正则表达式的行为和我预期的一样,它匹配以Xtal开头的句子,并且在输入Declare MyDeclaration时匹配。当我尝试在我的Delph应用程序中使用它时,它只会检测到第一项,即Xtal

这是我的密码

function GetItems(SourceCode: String; ItemCategory: TItemCategory): String;  Overload;
Var Regex: TRegEx;
    Match: TMatch;

    begin
      Match := DeclareRx.Match(SourceCode);
      while Match.Success do begin
        Result := Match.Groups.Item[1].Value;
        Match := Match.NextMatch;
      end;
    end;

    DeclareRx := TRegEx.Create('^\s*(Xtal)\s*=\s*[0-9]*+|^\s*Declare\s+([a-z]+[a-z0-9_])*\s+', [roIgnoreCase, roMultiline, roCompiled]);

我假设我需要在匹配代码中执行其他操作。请解释Match.Gorups.Item[]索引是否引用了每个正则表达式项?

我理解这是一个旧的Q,但不知道为什么它会被恢复

您显示的函数不会再次匹配,但每次都会覆盖结果-可能没有帮助

我总是使用TPerlRegEx而不是TRegEx,但假设它们是相同的:

组。项[0]
是匹配字符串的全部,然后是
组。项[1]
是要求的第一个匹配组,
组。项[2]
是第二个匹配组,依此类推

您在
Xtal
周围有一个匹配组(括号),因此这将始终是您的第一个匹配(这就是您所说的您得到的)

您可能不希望Xtal周围有括号(没有括号,它总是匹配的,并且模式没有变化,所以我不清楚您为什么会在意)。因此,要么删除Xtal周围的括号,要么使用
Groups.Item[2]
获得您感兴趣的实际匹配组


如果您想要所有匹配项,可以将匹配项添加到tstring中,或者连接结果,或者提供一个回调函数来接收每个匹配项。

我理解这是一个旧的Q,不知道为什么它会被恢复

您显示的函数不会再次匹配,但每次都会覆盖结果-可能没有帮助

我总是使用TPerlRegEx而不是TRegEx,但假设它们是相同的:

组。项[0]
是匹配字符串的全部,然后是
组。项[1]
是要求的第一个匹配组,
组。项[2]
是第二个匹配组,依此类推

您在
Xtal
周围有一个匹配组(括号),因此这将始终是您的第一个匹配(这就是您所说的您得到的)

您可能不希望Xtal周围有括号(没有括号,它总是匹配的,并且模式没有变化,所以我不清楚您为什么会在意)。因此,要么删除Xtal周围的括号,要么使用
Groups.Item[2]
获得您感兴趣的实际匹配组


如果需要所有匹配项,可以将匹配项添加到tstring中,或者连接结果,或者提供回调函数来接收每个匹配项。

正则表达式就是这样工作的。您需要在输入文本中循环输入正则表达式,该部分文本在您刚刚找到的匹配项之后开始。安装RegExBuddy后,我修改并测试了我的正则表达式,它在RegExBuddy中工作正常,但使用上述代码,我不会返回第二项。我只在一行上运行此正则表达式,并且只希望Xtal或声明要返回的捕获组。我不明白文本是如何循环的。我认为上面的代码会返回一个或另一个捕获组,或者如果没有匹配,则不会返回任何内容。一旦处理了匹配项,请删除包含该匹配项的所有文本,然后将其输入正则表达式。重复此操作,直到找不到匹配项。该行上只会有一个匹配项,当我有一行以Declare开头时,我永远不会得到匹配项。我不得不这样使用它,因为我需要捕获匹配发生的行号。仅供参考,我正在为我正在开发的IDE解析程序代码文本。这就是regex的工作原理。您需要在输入文本中循环输入正则表达式,该部分文本在您刚刚找到的匹配项之后开始。安装RegExBuddy后,我修改并测试了我的正则表达式,它在RegExBuddy中工作正常,但使用上述代码,我不会返回第二项。我只在一行上运行此正则表达式,并且只希望Xtal或声明要返回的捕获组。我不明白文本是如何循环的。我认为上面的代码会返回一个或另一个捕获组,或者如果没有匹配,则不会返回任何内容。一旦处理了匹配项,请删除包含该匹配项的所有文本,然后将其输入正则表达式。重复此操作,直到找不到匹配项。该行上只会有一个匹配项,当我有一行以Declare开头时,我永远不会得到匹配项。我不得不这样使用它,因为我需要捕获匹配发生的行号。仅供参考,我正在为正在开发的IDE解析程序代码文本。