Регулярное выражение для анализа текста в формате JSON - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть регулярное выражение в форме:

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], пробел, $, %, ^ и т. Д. Я пытаюсь использовать регулярное выражение, которое может соответствовать {Поле1: значение} {Поле2: значение} {Поле3: значение} отдельно в TCL.

1 Ответ

4 голосов
/ 13 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...