Я пытаюсь разбить строку без регулярного выражения в более идиоматическом функциональном подходе.
case class Parsed(blocks: Vector[String], block: String, depth: Int)
def processChar(parsed: Parsed, c: Char): Parsed = {
import parsed._
c match {
case '|' if depth == 0
=> parsed.copy(block = "", blocks = blocks :+ block ,
depth = depth)
case '[' => parsed.copy(block = block + c,
depth = depth + 1)
case ']' if depth == 1
=> parsed.copy( block = "", blocks = blocks :+ (block + c),
depth = depth - 1)
case ']' => parsed.copy(block = block + c,
depth = depth - 1)
case _ => parsed.copy(block = block + c)
}
}
val s = "Str|[ts1:tssub2|ts1:tssub2]|BLANK|[INT1|X.X.X.X|INT2|BLANK |BLANK | |X.X.X.X|[INT3|s1]]|[INT3|INT4|INT5|INT6|INT7|INT8|INT9|INT10|INT11|INT12|INT13|INT14|INT15]|BLANK |BLANK |[s2|s3|s4|INT16|INT17];[s5|s6|s7|INT18|INT19]|[[s8|s9|s10|INT20|INT21]|ts3:tssub3| | ];[[s11|s12|s13|INT21|INT22]|INT23:INT24|BLANK |BLANK ]|BLANK |BLANK |[s14|s15]"
val parsed = s.foldLeft(Parsed(Vector(), "", 0))(processChar)
parsed.blocks.size //20
parsed.blocks foreach println
Я ожидаю получить следующий результат (parsed.blocks.size должно быть 12).
Str
[ts1:tssub2|ts1:tssub2]
BLANK|
[INT1|X.X.X.X|INT2|BLANK |BLANK | |X.X.X.X|[INT3|s1]]
[INT3|INT4|INT5|INT6|INT7|INT8|INT9|INT10|INT11|INT12|INT13|INT14|INT15]
BLANK
BLANK
[s2|s3|s4|INT16|INT17];[s5|s6|s7|INT18|INT19]
[[s8|s9|s10|INT20|INT21]|ts3:tssub3| | ];[[s11|s12|s13|INT21|INT22]|INT23:INT24|BLANK |BLANK ]
BLANK
BLANK
[s14|s15]
Однако результат, который я получаю (parsed.blocks.size равен 20)
Str
[ts1:tssub2|ts1:tssub2]
BLANK
[INT1|X.X.X.X|INT2|BLANK|BLANK||X.X.X.X|[INT3|s1]]
[INT3|INT4|INT5|INT6|INT7|INT8|INT9|INT10|INT11|INT12|INT13|INT14|INT15]
BLANK
BLANK
[s2|s3|s4|INT16|INT17]
;[s5|s6|s7|INT18|INT19]
[[s8|s9|s10|INT20|INT21]|ts1:tssub2||]
;[[s11|s12|s13|INT21|INT22]|INT23:INT24|BLANK|BLANK]
BLANK
BLANK
[s14|s15]
Насколько я понимаю, это небольшая вариация проблемы балансировки скобок. Однако в данном случае ;
означало бы своего рода продолжение.
У меня два вопроса в этом случае
1) Откуда появилась лишняя запись /пробел после [ts1:tssub2|ts1:tssub2]
, тоже после
[INT1|X.X.X.X|INT2|BLANK|BLANK||X.X.X.X|[INT3|s1]]
, [INT3|INT4|INT5|INT6|INT7|INT8|INT9|INT10|INT11|INT12|INT13|INT14|INT15]
и ;[[s11|s12|s13|INT21|INT22]|INT23:INT24|BLANK|BLANK]
в моем результате также?
2) Здесь на данный момент [s2|s3|s4|INT16|INT17]
и ;[s5|s6|s7|INT18|INT19]
войти как две разные записи. Однако это должно быть объединено как [s2|s3|s4|INT16|INT17];[s5|s6|s7|INT18|INT19]
одна запись[Так же
[[s8|s9|s10|INT20|INT21]|ts1:tssub2||]
а также
;[[s11|s12|s13|INT21|INT22]|INT23:INT24|BLANK|BLANK])
также]. Любые подсказки, как это сделать?
parsed
в начале и какое отношение он имеет кval parsed
ближе к концу? - person Andrey Tyukin   schedule 11.04.2018