如何从Delphi DFM文件中删除属性?

时间:2017-08-16 12:13:05

标签: regex notepad++

我有很多文件(DFM Delphi源文件),我希望从特定类的所有组件中删除特定属性。

每个组件定义都以单词objectinherited开头,后跟:

  • 空格
  • 组件的名称(字母数字)
  • Colon :
  • 空格
  • 组件的类别(字母数字)

以下行表示组件的属性,由以下组成:

  • 物业名称(字母数字)
  • 空格
  • 等号=
  • 空格
  • 属性值(字母数字)

也可能有其他嵌套组件,遵循相同的语法规则。

组件定义以end关键字结束。 这是一个例子:

inherited Test: TTest
  OtherProperty = 'Hello'
  inherited Component1: TTargetClass
    OtherProperty = 100
    TargetProperty = True
  end
  object Component1: TTargetClass
    OtherProperty = 'Hello'
  end
  object Component2: TPanel
    OtherProperty = 100
    TargetProperty = True
    object NestedComponent1: TTargetClass
      OtherProperty = 'Hello'
      TargetProperty = False
    end
  end
end

可能这不是最好的方法,但我希望在RegEx中使用Notepad++来实现我的目标。 我要移除的属性是TargetProperty,我想删除仅包含类TTargetClass的组件的行。

inherited Test: TTest
  OtherProperty = 'Hello'
  inherited Component1: TTargetClass
    OtherProperty = 100
  end
  object Component1: TTargetClass
    OtherProperty = 'Hello'
  end
  object Component2: TPanel
    OtherProperty = 100
    TargetProperty = True
    object NestedComponent1: TTargetClass
      OtherProperty = 'Hello'
    end
  end
end

我已尝试过以下RegEx,但它从第一个TTargetClass到最后一个end匹配:

TTargetClass.*(TargetProperty.*\R)end

1 个答案:

答案 0 :(得分:1)

您可以使用

(TTargetClass(?:\R(?!\h*end$).*)*?)^\h*TargetProperty.*\R+(\h*end$)

并替换为$1$2。请参阅regex demo

enter image description here

<强>详情

  • (TTargetClass(?:\R(?!\h*end$).*)*?) - 第1组捕获:
    • TTargetClass - 文字子字符串
    • (?:\R(?!\h*end$).*)*? - 零或更多,但尽可能少,以下是:
      • \R(?!\h*end$) - 一个没有跟随0+水平空格(\h*)的换行符,然后是行末尾的end子字符串($
      • .* - 其余部分
  • ^\h* - 在
  • 之后开始一个0+水平空格的行
  • TargetProperty - 文字子字符串
  • .* - 其余部分
  • \R+ - 一个或多个换行符
  • (\h*end$) - 第2组:0+水平空格和行尾的end子字符串。

$1是一个反向引用,指的是使用第1组捕获的文本,而$2是指使用第2组捕获的文本。