我怎样才能在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:是的,它们都包含一个类型标记,这是一个完整的示例:。如您所见,有几种类型的层,可以通过它们的类型来识别。但我想查找数据并删除/替换它们会更容易、更省事。