我有很多文件(DFM Delphi源文件),我希望从特定类的所有组件中删除特定属性。
每个组件定义都以单词object
或inherited
开头,后跟:
:
以下行表示组件的属性,由以下组成:
=
也可能有其他嵌套组件,遵循相同的语法规则。
组件定义以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
答案 0 :(得分:1)
您可以使用
(TTargetClass(?:\R(?!\h*end$).*)*?)^\h*TargetProperty.*\R+(\h*end$)
并替换为$1$2
。请参阅regex demo。
<强>详情
(TTargetClass(?:\R(?!\h*end$).*)*?)
- 第1组捕获:
TTargetClass
- 文字子字符串(?:\R(?!\h*end$).*)*?
- 零或更多,但尽可能少,以下是:
\R(?!\h*end$)
- 一个没有跟随0+水平空格(\h*
)的换行符,然后是行末尾的end
子字符串($
) .*
- 其余部分^\h*
- 在TargetProperty
- 文字子字符串.*
- 其余部分\R+
- 一个或多个换行符(\h*end$)
- 第2组:0+水平空格和行尾的end
子字符串。 $1
是一个反向引用,指的是使用第1组捕获的文本,而$2
是指使用第2组捕获的文本。