【发布时间】:2018-09-21 18:07:30
【问题描述】:
我正在尝试以更惯用的功能方法拆分没有正则表达式的字符串。
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]
据我了解,这是parenthesis balancing problem 的细微变化。但是在这种情况下,; 将意味着某种延续。
在这种情况下我有两个问题
1) [ts1:tssub2|ts1:tssub2] 之后的额外条目 /space 是如何来的,也是在之后
[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有什么关系? -
对不起,我没有包含案例类并弄乱了导入,这是我的错。更新了问题
-
次要细节:我仍然会将 import inside 函数缩进两个空格。 Scala 支持本地导入,没有理由将它们与行首对齐。
-
同意,有一个坏习惯,即不要像您指出的那样缩进导入。我猜这是由于广泛的 Java 背景。
标签: scala parsing string-parsing idioms purely-functional