1

我有一个带有分层文本的结构化文件,它描述了 Delphi 中的 GUI(一个 DFM 文件)。

假设我有这个文件,我必须匹配 TmyButton(标记)上下文中的所有“Color = xxx”行,而不是其他上下文中的那些。在 TMyButton-Context 内不会有更深的层次结构。

object frmMain: TfrmMain
  Left = 311
  Top = 201
  Color = clBtnFace
  object MyFirstButton: TMyButton
    Left = 555
    Top = 301
    Color = 16645072           <<<<<<MATCH THIS
    OnClick = ButtonClick
  end
  object MyLabel: TLabel
    Left = 362
    Top = 224
    Caption = 'a Caption'
    Color = 16772831
    Font.Color = clWindowText
  end
  object Panel2: TLTPanel
    Left = 348
    Top = 58
    Width = 444
    Height = 155
    Color = clRed
    object MyOtherButton: TMyButton
      Left = 555
      Top = 301
      Color = 16645072         <<<<<<MATCH THIS
      OnClick = ButtonClick
    end
  end
end

我试了两天,做了很多很多不同的尝试。这是我的一些不完整的模式:

/^[ ]{2,}object [A-Za-z0-9]+: TmyButton\r\n/mi  <<<Matches the needed context
/^[ ]{4,}Color = [A-Za-z0-9]+\r\n/mi            <<<Matches the needed result
/^[ ]{2,}end\r\n/mi                             <<<Matches the end of the context

(我不知道为什么,但我不得不使用“\r\n”而不是“$”......)。我需要把它放在一起,但忽略除其他“object xxx:yyy”和“end”行之外的其他行......

我很高兴能得到一些帮助!

4

3 回答 3

1

我知道这不是 PCRE,而是软件考古学的一个很好的选择。

如果您从命令提示符处执行此操作,您可以随时使用 AWK。脚本如下所示:

BEGIN       { inObj = 0; } // Not really necessary
/TMyButton/ { inObj = 1; }
/end$/      { inObj = 0; }
/^[ ]{4,}Color = [A-Za-z0-9]+\r\n/ && inObj == 1
            { //do whatever you need to do
              print $3;
            }

AWK 可以在整个互联网上找到。我会尝试GAWK

于 2009-09-25T12:26:09.757 回答
1

如果您想要或必须使用单个正则表达式来匹配复杂上下文中的行,则需要一个称为环视的正则表达式功能。具体来说,您需要 PCRE 不提供的可变长度后视。

所以有两种可能性:使用像 Rorick 建议的脚本方法或使用匹配从所需上下文开始到实际匹配的所有内容的正则表达式,并使用捕获组提取它。那可以用

[ ]{2,}object \w+: TMyButton\r\n.*?^([ ]{4,}Color = \w+[ \t]*\r\n)

(为清楚起见,插入空格周围的括号)。您的比赛将在捕获组中\1

嵌套结构通常不太适合正则表达式(更适合解析器),但如果您确定您提到的数据结构,它可能工作正常。

于 2009-09-24T09:43:48.640 回答
1

如果我理解正确,您尝试为此创建单个正则表达式。没有理由这样做。

  1. 只需找到带有图案的线条object [A-Za-z0-9]+: TmyButton
  2. 然后检查每一下一行,Color = [A-Za-z0-9]+直到找到它或到达end关键字。
  3. 重复步骤直到文件结束

如果您尝试修改大量源文件,则可以为此目的使用一些脚本。

于 2009-09-24T09:32:20.043 回答