使用平衡组匹配配置文件

时间:2017-03-09 23:55:46

标签: .net regex parsing

我有使用BEGIN和END关键字在嵌套结构中存储字段的文件。例如,

BEGIN Root_Name

    var1 = 0
    var2 = "string"
    var3 = "string"

    BEGIN node1
        var = "string"
        var= 1

        BEGIN node2
            var = 1
        END

        what_about_me = "??"
    END
END

我的正则表达式能够首先匹配 Root_Name 中的整个树结构,直到匹配 END 直到 node1 。但是,如果我将字符串从node1传递到结束,那么我的正则表达式只会匹配到第一个 END 。 (即它将无法捕获what_about_me变量)我最近学会了平衡组,我想知道如何使用它来完全递归树。

这是我正在使用的正则表达式,用于匹配根树和子根。 (差异是^和$来锚定值)

$AnchoredDelimiter = "(^(BEGIN)(\s+)((`".*`")|((\w|_|-)+))[\r\n]*)" 
$AnchoredClose = "((?-i)^END(\t| )*)" 
$Root = "$AnchoredDelimiter$Body$AnchoredClose"

$Delimiter = "((BEGIN)(\s+)((`".*`")|(\w|_|-)+)[\r\n]*)" 
$Body = "((.|[\r\n])*?)"
$Close = "((?-i)END(\t| )*)"  
$SubRoot = "$StandAlone$Delimiter$Body$Close"

1 个答案:

答案 0 :(得分:0)

使用正则表达式

$Delimiter = "(((?-i)BEGIN(?i))(\s+)((`".*`")|(\w|_|-)+)[\r\n]*)"
$Close = "((?-i)\bEND\b(?i))" 
$Root = "(?m)$Delimiter(?<Contents>(?>\s|(?<Delimiter>$Delimiter)|(?<-Delimiter>$Close)|.)+?(?(Delimiter)(?!)))$Close"