带条件或正则表达式的String.split()



我想用逗号分隔符将字符串转换为列表,但如果逗号后有特定单词,则需要条件。

这是我的输入字符串:

val x = "StructField(AverageOverallRating1,DoubleType,true),StructType(AverageOverallRating2,DoubleType,true),ArrayType(AverageOverallRating3,DoubleType,true),StructType(StructField(AverageOverallRating1,DoubleType,true),StructField(AverageOverallRating1,DoubleType,true))"

我想得到这样的结果:

StructField(AverageOverallRating1,DoubleType,true)
StructType(AverageOverallRating2,DoubleType,true)
ArrayType(AverageOverallRating3,DoubleType,true)
StructType(StructField(AverageOverallRating1,DoubleType,true),StructField(AverageOverallRating1,DoubleType,true))

我试图拆分(","(,但它不起作用,我认为解决方案是使用regex,但我找不到正确的表达式

如果我要解析那个东西,我会使用类型-一旦我得到了具有合理表示的ADT,我就会决定如何处理它。例如,使用fastparse 2,我会尝试以某种方式实现它:

import fastparse._, NoWhitespace._
def boolean[_: P]: P[Boolean] = P( "true" | "false" ).map(_.toBoolean)
// assuming that there is a type DoubleType
sealed trait DoubleType
objecy DoubleType extends DoubleType
def doubleType[_ : P]: P[DoubleType] = P( "DoubleType" ).map(_ => DoubleType)
// assuming there is an enum AverageOverallRating with withName method
sealed trait AverageOverallRating
object AverageOverallRating {
case object AverageOverallRating1 extends AverageOverallRating
case object AverageOverallRating2 extends AverageOverallRating
case object AverageOverallRating3 extends AverageOverallRating

def withName(string: String): AverageOverallRating = ???
}
def averageOverallRating: P( "AverageOverallRating1" | "AverageOverallRating2" | "AverageOverallRating3" ).map(AverageOverallRating.withName)
sealed trait Entry
case class StructField(averageOverallRating: averageOverallRating, doubleType: DoubleType, boolean: Boolean) extends Entry
case class StructType(averageOverallRating: averageOverallRating, doubleType: DoubleType, boolean: Boolean) extends Entry
case class ArrayType(averageOverallRating: averageOverallRating, doubleType: DoubleType, boolean: Boolean) extends Entry
def structField[_ : P]: P[StructField] = P( "StructField" ~ "(" ~ averageOverallRating ~ "," ~ doubleType ~ "," ~ boolean ~ ")").map {
case (_, _, a, _, b, _, c, _) => StructField(a, b, c)
}
def structType[_ : P]: P[StructType] = P( "StructType" ~ "(" ~ averageOverallRating ~ "," ~ doubleType ~ "," ~ boolean ~ ")").map {
case (_, _, a, _, b, _, c, _) => StructField(a, b, c)
}
def arrayType[_ : P]: P[ArrayType] = P( "ArrayType" ~ "(" ~ averageOverallRating ~ "," ~ doubleType ~ "," ~ boolean ~ ")").map {
case (_, _, a, _, b, _, c, _) => StructField(a, b, c)
}
def entry[_ : P]: P[Entry] = P(structField | structType | arrayType)
def entries[_ : P]: P[List[Entry]] = P( entry ~ ("," ~ entry).rep ).map { case (head, tail) =>
head +: tail.toList.map(_._2)
}
val input = "StructField(AverageOverallRating1,DoubleType,true),StructType(AverageOverallRating2,DoubleType,true),ArrayType(AverageOverallRating3,DoubleType,true),StructType(StructField(AverageOverallRating1,DoubleType,true),StructField(AverageOverallRating1,DoubleType,true))"
val result = parse(input, entries(_))

(免责声明:这只是一个快速编写的草稿/示例/伪代码,我不希望它能立即编译并工作(。

一旦我得到result并确保它是正确的,我就会使用List[Entry]来产生更容易的最终结果,例如

entries.map(_.toString).mkString("n")

最新更新