Regex如何查找以“开始”的行块;TcxGridDBBandedColumn";,以“结束”;完";而不包括「;宽度“;在…内

Regex如何查找以“开始”的行块;TcxGridDBBandedColumn";,以“结束”;完";而不包括「;宽度“;在…内,regex,Regex,我试图在dfm文件中找到不包含Width参数的TcxGridDBBandedColumn声明。 每个声明都以TcxGridDBBandedColumn开始,以end-word结束。它可以在块内有多条带多个参数的线,但不能有带宽度参数的线 我已经构建了regex来查找块: ^.*TcxGridDBBandedColumn(.|[\r\n])*?end 它看起来工作正常,但我找不到如何添加条件以排除指定了宽度参数的块 文本示例: object cxGrid_MainDBBand

我试图在dfm文件中找到不包含Width参数的TcxGridDBBandedColumn声明。 每个声明都以TcxGridDBBandedColumn开始,以end-word结束。它可以在块内有多条带多个参数的线,但不能有带宽度参数的线

我已经构建了regex来查找块:

^.*TcxGridDBBandedColumn(.|[\r\n])*?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
          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])*
来匹配任何字符,因为每个字符都会有一个替换。其他选项包括使用
[\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]*对象。*\bTcxGridDBBandedColumn
  • (?:
    非捕获组
    • \r?\n(?!
      匹配换行符并断言右边的内容不是
      • [^\S\r\n]*(?:Width=| end$)
        匹配0+个空格,然后选择
        Width=
        end
    • *
      匹配任意字符0+次
  • )*
    关闭组并重复0多次以匹配所有行
  • \r?\n[^\S\r\n]*end
    匹配换行符、可选空格和
    end
  • $
    字符串结尾

您可以通过匹配所有不以属性或
Width=
end
开头的行(如果总是以
object
开头),使匹配更加具体,您也可以在模式中使用该行<代码>^[^\S\r\n]*对象。*\bTcxGridDBBandedColumn(?:\r?\n(?![^\S\r\n]*(?:Width=| end$)。)*\r?\n[^\S\r\n]*end$谢谢。行得通,不客气。我已将其添加为