2015-06-15 2 views
0

изображений я получил следующее:Scala респ сепаратор для конкретной области текста

--open 
Client: enter 
Nick 
Age 28 
Rosewell, USA 

Client: enter 
Maria 
Age 19 
Cleveland, USA 
--open-- 

Мне нужен результат, близкий к следующему: List(List(Nick, Age 28, Rosewell), List(Maria, Age19, Cleveland))

Это может быть как многие клиенты внутри открытого тела, как вы может представить, поэтому список может иметь любой размер, он не фиксирован.

Я пытался сделать с помощью следующих действий:

repsep(".*".r , "Client: enter" + lineSeparator) 

В этом случае все, что я могу разобрать его эта строка List((Client: enter)), как убедиться, что вы работаете с той же самой части синтаксического анализа текста?

+0

'r' соответствует только одну строку "*.".. Он не соответствует разделителям строк. – Kolmar

ответ

1

Я думаю, вы используете RegexParsers (просто отметьте, что он пропускает белые пробелы по умолчанию). Я предполагаю, что он заканчивается "\n\n--open--" вместо этого (если вы можете изменить это, в противном случае я покажу вам, как изменить парсер repsep). С этим изменением мы видим, что текст имеет следующую структуру:

  • каждый клиент отделен от текста "Client: enter"
  • то вам нужно разобрать каждую строку после этого не пусто, разделенный символа возврата каретки
  • если у вас есть пустая строка, разобрать два сепаратора строки и повторите шаг 2, если это возможно в противном случае это означает, что мы достигаем конца входного


Тогда реализация парсера straigh tforward:

object ClientParser extends RegexParsers { 

    override def skipWhitespace = false 

    def lineSeparator = "\n" 
    def root = "--open" ~> lineSeparator ~> rep(client) <~ "--open--" 
    def client = ("Client: enter" ~ lineSeparator) ~> repsep(".+".r, lineSeparator) <~ rep(lineSeparator) 
} 

Запуск его:

--open 
Client: enter 
Nick 
Age 28 
Rosewell; USA 

Client: enter 
Maria 
Age 19 
Cleveland; USA 

--open-- 

Вы получаете:

[12.9] parsed: List(List(Nick, Age 28, Rosewell; USA), List(Maria, Age 19, Cleveland; USA)) 
+0

спасибо, что это работает! – perc

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