逐步使用正则表达式

时间:2019-09-05 08:25:31

标签: scala pattern-matching

我想将较长的字符串“分解”为较小的字符串,并将结果存储在单独的变量中。我的意思是:

// my string to split
val fileName: String = '15_data_doc1-financial-aspects_20190105_101000_c_from-another-department.csv

// split into smaller variables...
val number = 15
val type   = "data"
val doc    = "doc1"
...

最好一步一步地完成,例如:1)在字符串上应用一些正则表达式并将结果保存到新变量中2)保存字符串的尾部并应用进一步的正则表达式逻辑创建下一个变量。

哪种解决方案最容易达成目标?模式匹配,尾部递归,只是在每个操作之后创建一个辅助变量?通常,我会使用'split'方法,但是在这种情况下,用于分割目的的字符很少。

欢迎任何建议。

2 个答案:

答案 0 :(得分:3)

如果不能使用插值字符串模式(Scala 2.13.0),则可以构建正则表达式来描述分解模式。

val fileName: String =
    "15_data_doc1-financial-aspects_20190105_101000_c_from-another-department.csv"

val FNPattern = "([^_]+)_([^_]+)_([^-]+)-([^.]+)\\.(.+)".r

fileName match {
  case FNPattern(number, tpe, doc, rest, ext) => s"$number, $tpe, $doc, $ext"
}
//res0: String = 15, data, doc1, csv

答案 1 :(得分:2)

尝试KrzysztofAtłasik建议的interpolated string patterns

"15_data_doc1-financial-aspects_20190105_101000_c_from-another-department.csv" match {
  case s"${number}_${filetype}_${doc}" => // use number, filetype, doc, etc. variables
}