通过scala中的正则表达式捕获逗号分隔列表作为列表

时间:2015-04-27 15:36:45

标签: regex scala

我输入的格式如下:

"DataType: FieldName1, Fieldname2,FieldName3" 

您可以拥有1个或多个字段名称。

例如:

User: Name, Address
Person: Age, Address,DOB

我尝试使用scala组捕获捕获字符串中的DataType和数组中的字段,这就是我现在所拥有的:

val dataTypeAndFieldsRegex = """(.+):(.*(,.*)?)""".r

"Person: Age, Address, DOB" match {
  case dataTypeAndFieldsRegex(dataType, fields, _*) => {
    println("dataType: " + dataType)
    println("fields: " + fields)
  }

问题是这里的字段是一个字符串。 如何将字段捕获为数组?

2 个答案:

答案 0 :(得分:2)

使用scala的解析器组合器,您可以拥有这些漂亮的小规则,并将它们组合起来以解析更复杂的数据:

object SO29900085 extends App {
  case class Schema(dataType: String, fields: Seq[String])

  object SchemaParser extends RegexParsers {
    def dataType: Parser[String] = """[^:]*""".r ^^ { _.toString }
    def field: Parser[String] = """[a-zA-Z]+""".r
    def fields: Parser[List[String]] = (field ~ ",".?).* ^^ { _.map(_._1) }

    def schema: Parser[Schema] = (dataType ~ ":" ~ fields) ^^ {
      case dataType ~ ":" ~ fields => Schema(dataType, fields)
    }
  }

  println(SchemaParser.parse(SchemaParser.schema, "User: Name, Address"))
  println(SchemaParser.parse(SchemaParser.schema, "Person: Age, Address,DOB"))
}

答案 1 :(得分:0)

您只需使用以下命令拆分fields

 fields.split(",")

我不知道你打算如何使用它,因为如果你试图打印它,输出看起来大概是这样的:

dataType: Person
fields: [Ljava.lang.String;@29e495ff