用于解析JSON的正则表达式,如文本

时间:2011-04-13 07:04:41

标签: regex tcl

我有正式表达形式:

Field1:Value
Field2:Value
Field3:Value

Field1:Value
Field2:Value
Field3:Value

Field1:Value
Field2:Value
Field3:Value

Field1:Value
Field2:Value
Field3:Value

冒号左侧的内容是标准的字母字符([a-zA-Z]),第一个字符始终以大写字母开头。它们不能是Field1或Field2或Field3以外的任何东西。但是,右边的值可以跨越多行,并且可以包含任何字符:[a-zA-Z],空格,$%^等。我正在尝试对于可以在TCL中单独匹配{Field1:value} {Field2:value} {Field3:value}的正则表达式。

1 个答案:

答案 0 :(得分:4)

一般来说,我的工作方法是首先将数据解析成行,然后为每行分配一个解释(例如,起始行或延续行),然后将起始行与它们的后续连续组合(形成“逻辑”行) )。只有完成一次后,我才会使用RE从值中拆分键。作为格式的建议,如果以空格开头,请尝试将该行作为延续。这很容易实现,并且在文件中看起来很好。

代码:

# Read the data from a file and split into lines
set f [open "filename"]
set lines [split [read $f] "\n"]
close $f

# Recombine into logical lines
set logicalLines {}
foreach realline $lines {
    if {[regexp "^ (.*)" $realline -> tail]} {
        append current "\n$tail"
    } else {
        if {[info exist current]} {
            lappend logicalLines $current
        }
        set current $realline
    }
}
lappend logicalLines $current         ;# Assume at least one line :-)

# Parse the logical lines
foreach line $logicalLines {
    if {[regexp {^([A-Z]\w+):(.*)$} $line -> key value]} {
        # OK, got $key mapping to $value
    } else {
        # It's a bogus line; waaaah!
    }
}

好吧,你可能有不同的线条组合规则,但通过将这些事情分成两个阶段,你可以让生活更轻松。同样,可以对线路有效性使用更严格的测试(例如用([A-Z]\w+)替换(Field[123])),但我不相信它实际上是合理的。