我怎样才能在c#中正确使用这个正则表达式?

我怎样才能在c#中正确使用这个正则表达式?,c#,regex,C#,Regex,我正在尝试匹配任何包含类型:“Data”的块,然后用我想要的文本替换它。 下面给出了一个示例输入,其中可以有一个或多个: layer { name: "cifar" type: "Data" top: "data" top: "label" include { phase: TRAIN } transform_param { mean_file: "examples/cifar10/mean.binaryproto" mirror: true

我正在尝试匹配任何包含
类型:“Data”
的块,然后用我想要的文本替换它。
下面给出了一个示例输入,其中可以有一个或多个:

layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TRAIN
  }
  transform_param {
    mean_file: "examples/cifar10/mean.binaryproto"
    mirror: true
    #crop_size: 20 
  }

# this is a comment!
  data_param {
    source: "examples/cifar10/cifar10_train_lmdb"
    batch_size: 100
    backend: LMDB
  }
}
layer {
  name: "cifar"
  type: "Data"
  top: "data"
  top: "label"
  include {
    phase: TEST
  }
  transform_param {
    mean_file: "examples/cifar10/mean.binaryproto"
  }
  data_param {
    source: "examples/cifar10/cifar10_test_lmdb"
    batch_size: 25
    backend: LMDB
  }
}
我想出了这个正则表达式:

((layer)( *)((\n))*{((.*?)(\n)*)*(type)( *):( *)("Data")((.*?)(\n)*)*)(.*?)(\n)}
我尝试对此进行建模:

find and select a block starting with layer, 
there can be any number of space characters but after it 
there should be a { character, 
then there can be anything( for making it easier), and then 
there should be a type followed by any number of spaces, then followed by "Data"
then anything can be there, until it is faced with a } character 
但显然,这并不能正常工作。如果我更改这些层块中的任何一个的类型,都不会检测到任何内容!,即使是具有
类型的层:“Data”

基于关于使用.net正则表达式进行括号匹配,您也可以调整所显示的正则表达式:

\((?>\((?)|[^()]+|\)(?)*(?(c)(?!)\)

它正在寻找匹配的
集,您可以简单地将它们交换为
{
}
(在该正则表达式中没有转义)

然后您可以为
层\s*
位加前缀

对于要排除
type
中“Data”
的块的功能,我在pastebin中为示例中的所有其他
type
关键字添加了一个负前瞻。不幸的是,为
类型添加一个积极的前瞻:“数据”
根本不起作用,我认为如果它起作用,那将是您最健壮的解决方案

希望您有一个有限的
类型
值列表,您可以扩展它以获得一个实用的解决方案:

layer\s*{(?!type:“准确性”| type:“卷积”| type:“丢失”| type:“内部产品”| type:“LRN”| type:“池化”| type:“ReLU”| type:“SoftmaxWithLoss”)+|}*(?(c)(?!)}


在原始正则表达式中使用的关键位是
[^()]+
,它匹配正则表达式的其他组件所匹配的括号之间的内容。我已经把它改编成了
[^{}]+
——就是“大括号以外的所有东西”——然后添加了长的“除了”子句,其中的关键字不匹配。

@Steve:不是。键(和一些值)没有引号,也没有逗号,加上
#
可能用于注释。在本例中,
type
仅出现在
中,并且始终在
名称
之后和
顶部
之前。如果这总是正确的,那么可以显著简化正则表达式。否则,该模型将使用什么数据结构?它是否有一个标记器/解析器/AST,您可以使用它更可靠地读取数据?或者您可以先将其转换为JSON/XML吗?是什么标识了您不想匹配的块?它们是否始终包含您可以连接到的内容,例如
类型:“Foo”
,然后您排除所有这些块,只剩下其他块,这些块将是
类型:“Data”
的块?@Orphid:not,不一定,他们可以有任何订单。这实际上是Caffe framework内部使用的一种格式,我想自动化一些过程,删除这些节并用另一节替换它,然后保存新文件并将其提供给Caffe进行进一步处理。@RobinMackenzie:是的,它们都包含一个类型标记,这是一个完整的示例:。如您所见,有几种类型的层,可以通过它们的类型来识别。但我想查找数据并删除/替换它们会更容易、更省事。