В общем, я бы работал, сначала разбирая данные в строки, затем назначая каждой строке интерпретацию (например, начальную строку или линию продолжения), затем комбинируя начальные строки с их последующими продолжениями (формируя «логические» строки). ). Только когда это будет сделано, я смогу использовать 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])
), но я не уверен, что это действительно разумно.