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日間、多くの異なる試みで試しました。ここに私の不完全なパターンの一部があります:

/^[ ]{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

私があなたを正しく理解しているなら、あなたはこれのために単一の正規表現を作成しようとします。そうする理由はありません。

  1. パターンのある線を見つけるだけobject [A-Za-z0-9]+: TmyButton
  2. 次に、次の各行を、Color = [A-Za-z0-9]+それが見つかるかendキーワードに到達するまでチェックします。
  3. ファイルの終わりまで手順を繰り返します

ソースファイルの大部分を変更しようとする場合は、この目的のためにスクリプトを使用できます。

于 2009-09-24T09:32:20.043 に答える
1

複雑なコンテキストで行を照合するには、単一の正規表現でそれを実行する必要がある場合、またはルックアラウンドと呼ばれる正規表現機能が必要です。具体的には、PCREが提供していない可変長ルックビハインドが必要になります。

したがって、2つの可能性があります。Rorickが提案したようなスクリプトアプローチを使用するか、必要なコンテキストの開始から実際の一致まですべてに一致する正規表現を使用し、キャプチャグループを使用してそれを抽出します。それはで行うことができます

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

(わかりやすくするために挿入されたスペースの周りの括弧)。あなたの試合はキャプチャグループになります\1

ネストされた構造は、一般的に正規表現には適していません(パーサーに適しています)が、前述のようにデータの構造が確実であれば、問題なく機能する可能性があります。

于 2009-09-24T09:43:48.640 に答える
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 に答える