2013-05-23 5 views
0

Я разбираю текст тела из входящих писем, ища пары ключ/значение.синтаксический анализ ключей/значений из строки

Пример Email Body
Имя: John
Фамилия: Smith
Email: [email protected]
Комментарии = Просто тест комментарий, который
может занимать несколько строк.

Я попытался использовать RegEx ([\w\d\s]+)\s?[=|:]\s?(.+) в многострочном режиме. Это работает для большинства электронных писем, но не работает, когда есть разрыв строки, который должен быть частью значения . Я не знаю достаточно о RegEx, чтобы идти дальше.

У меня есть еще один синтаксический анализатор, который идет по очереди и ищет пары ключ/значение и просто складывает строку в последнее согласованное значение, если пара ключей/значений НЕ найдена. Он реализован в Scala.

val lines = text.split("\\r?\\n").toList 
var lastLabelled: Int = -1 
val linesBuffer = mutable.ListBuffer[(String, String)]() 

// only parse lines until the first blank line 
// null_? method is checks for empty strings and nulls 
lines.takeWhile(!_.null_?).foreach(line => { 
    line.splitAt(delimiter) match { 
    case Nil if line.nonEmpty => { 
     val l = linesBuffer(lastLabelled) 
     linesBuffer(lastLabelled) = (l._1, l._2 + "\n" + line) 
    } 
    case pair :: Nil => { 
     lastLabelled = linesBuffer.length 
     linesBuffer += pair 
    } 
    case _ => // skip this line 
    } 
}) 

Я пытаюсь использовать регулярные выражения, так что я могу сохранить анализатор БД и изменить его на основе каждого отправителя во время выполнения (реализации различных парсеров для разных отправителей).

Может ли мой RegEx быть изменен для соответствия значениям, содержащим символы новой строки? Нужно ли просто забыть об использовании RegEx и использовать JavaScript? У меня уже есть парсер JavaScript, который позволяет мне хранить JS в БД и, по сути, делать все, что я хочу хочу делать с парсером RegEx.

+3

Если вы хотите синтаксический анализатор, напишите парсер. –

+1

Вы говорите, что я должен использовать что-то вроде ANTLR (генератор парсера)? Я действительно ищу быстрое решение этой проблемы без необходимости вводить новый набор инструментов. –

ответ

0

Я думаю, что это должно работать ...

((.+?)((\s*)(:|=)(\s*)))(((.|\n)(?!((.+?)(:|=))))+) 

... как проверено здесь http://regexpal.com/. Если вы пройдете через спички, вы сможете вытащить ключ и значение.

Смежные вопросы