應該使用Scala模式匹配和正則表達式逐行解析文本文件。如果一行以"names:\t"
開頭,則後續製表符分隔的名稱應該作爲Seq[String]
(或類似名稱)提供。與可變數量的匹配捕獲組匹配的正則表達式模式
這裏的非工作代碼例如:
val Names = "^names:(?:\t([a-zA-Z0-9_]+))+$".r
"names:\taaa\tbbb\tccc" match {
case Names(names @ _*) => println(names)
// […] other cases
case _ => println("no match")
}
輸出:List(ccc)
求購輸出:List(aaa, bbb, ccc)
下面的代碼工作如期望...
object NamesObject {
private val NamesLine = "^names:\t([a-zA-Z0-9_]+(?:\t[a-zA-Z0-9_]+)*)$".r
def unapplySeq(s: String): Option[Seq[String]] = s match {
case NamesLine(nameString) => Some(nameString.split("\t"))
case _ => None
}
}
"names:\taaa\tbbb\tccc" match {
case NamesObject(names @ _*) => println(names)
// […] other cases
case _ => println("no match")
}
輸出(如希望):WrappedArray(aaa, bbb, ccc)
我想知道:這是可能的更簡單的方式,而不創建一個object
,就像在第一個,但不工作的代碼示例?
斯卡拉'RegEx'提取器是_match_,而不是_find_,所以'^'和'$'是多餘的。如果你想要_find_語義,你需要'。*'在開始和/或結束。 (雖然與您正在嘗試解決的問題無關) – 2013-03-26 15:23:41
@RandallSchulz謝謝,很高興知道。 – hiddenbit 2013-03-26 15:26:30