regex - 正则表达式如何查找以“TcxGridDBBandedColumn”开头、以“end”结尾且内部不包含“Width”的行块
问题描述
我试图在不包含 Width 参数的 dfm 文件中找到 TcxGridDBBandedColumn 的声明。每个声明都以 TcxGridDBBandedColumn 开头,以结束词结尾。它可以在块内有很多行和很多参数,但不能有带宽度参数的行。
我已经构建了正则表达式来查找一个块:
^.*TcxGridDBBandedColumn(.|[\r\n])*?end
它看起来工作正常,但我找不到如何添加条件以排除指定了 Width 参数的块。
文本示例:
object cxGrid_MainDBBandedTableView1SUMA: TcxGridDBBandedColumn
Caption = 'Suma'
DataBinding.FieldName = 'SUMA'
RepositoryItem = Form_Resursai.cxEditRepository_MainCurrencyItem_DefKaina
Position.BandIndex = 1
Position.ColIndex = 7
Position.RowIndex = 0
end
object cxGrid_MainDBBandedTableView1DBABSTRMAZMKAINA: TcxGridDBBandedColumn
Caption = 'Ma'#382'm.Kaina'
DataBinding.FieldName = 'MAZMKAINA'
RepositoryItem = Form_Resursai.cxEditRepository_MainCurrencyItem_DefKaina
Visible = False
Width = 60
Position.BandIndex = 0
Position.ColIndex = 6
Position.RowIndex = 0
end
它应该只找到块:
object cxGrid_MainDBBandedTableView1SUMA: TcxGridDBBandedColumn
Caption = 'Suma'
DataBinding.FieldName = 'SUMA'
RepositoryItem = Form_Resursai.cxEditRepository_MainCurrencyItem_DefKaina
Position.BandIndex = 1
Position.ColIndex = 7
Position.RowIndex = 0
end
因为它没有宽度。
解决方案
在您尝试的模式中,(.|[\r\n])*
不推荐使用 using 来匹配任何字符,因为每个字符都会有一个交替。其他选项正在使用 [\s\S]*?
或使点匹配换行符。
它也在重复捕获组,并且只会为您提供最后一次迭代的捕获值,该值将是单个字符。
在这种情况下,您可以匹配以 结尾的第一行TcxGridDBBandedColumn
。
然后您可以匹配所有不以任何开头end
或包含的行Width =
^[^\S\r\n]*object .*\bTcxGridDBBandedColumn(?:\r?\n(?![^\S\r\n]*(?:Width =|end$)).*)*\r?\n[^\S\r\n]*end$
^
字符串的开始[^\S\r\n]*object .*\bTcxGridDBBandedColumn
(?:
非捕获组\r?\n(?!
匹配换行符并断言右边的不是[^\S\r\n]*(?:Width =|end$))
匹配 0+ 个空格和Width =
或者end
.*
匹配任何字符 0+ 次
)*
关闭组并重复 0+ 次以匹配所有行\r?\n[^\S\r\n]*end
匹配换行符、可选空格和end
$
字符串结束
推荐阅读
- javascript - 缺少滚动条或缺少限制
- reactjs - 如何在 ReactJS 前端正确转换日期
- c# - 如何在 C# MVC 中过滤下拉列表
- ios - UISegmentedControl iOS 13 清除颜色
- python-2.7 - 使用 BeautifulSoup 抓取时,我得到一个 0kb 的 TXT 文件
- python - Plotly express 不在 jupyter lab 中渲染
- ios - VLC ios中调用的主要故事板是什么?
- hibernate - EntityJavaDescriptorImpl 不能转换为 org.hibernate.type.descriptor.java.spi.EmbeddableJavaDescriptor
- azure-cosmosdb - 使用 SQL 查询查询 Cosmos DB 更改源
- javascript - renderToString 正在使文件的每个字符都小写,所以无法渲染,如何解决这个问题?