我有正式表达形式:
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}的正则表达式。
答案 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])
),但我不相信它实际上是合理的。