首页 > 解决方案 > 正则表达式如何查找以“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

因为它没有宽度。

标签: regex

解决方案


在您尝试的模式中,(.|[\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
  • $字符串结束

正则表达式演示


推荐阅读