代码之家  ›  专栏  ›  技术社区  ›  Tomasz

逐步使用regex

  •  0
  • Tomasz  · 技术社区  · 7 年前

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

    // 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"
    ...
    

    一步一步做就好了

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

    欢迎任何建议。

    1 回复  |  直到 7 年前
        1
  •  3
  •   jwvh    7 年前

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

    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
    
        2
  •  2
  •   Mario Galic    7 年前

    尝试 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
    }