首页 > 解决方案 > 如何在scala中选择具有指定模式的文件名

问题描述

OTC_omega_20210302.csv
CH_delta_20210302.csv
MD_omega_20210310.csv
CD_delta_20210310.csv

val hdfsPath = "/development/staging/abcd-efgh"
val fs = org.apache.hadoop.fs.FileSystem.get(spark.sparkContext.hadoopConfiguration)

val files = fs.listStatus(new Path(s"${hdfsPath}")).filterNot(_.isDirectory).map(_.getPath)
val regX = "OTC_*[0-9].csv|CH_*[0-9].csv".stripMargin.r
val filteredFiles = files.filter(fName => regX.findFirstMatchIn(fName.getName).isDefined)

如果我需要任何以(OTC_ 或 CH_)开头并以 YYYYMMDD.csv 结尾的文件名,我需要提供什么正则表达式?

根据上述文件,我需要两个输出 OTC_omega_20210302.csv CH_delta_20210302.csv

请帮忙

标签: regexscala

解决方案


您可以使用

val regX = "^(?:OTC|CH)_.*[0-9]{8}\\.csv$".r
val regX = """^(?:OTC|CH)_.*[0-9]{8}\.csv$""".r

请参阅正则表达式演示

详情

  • ^- 字符串的开始
  • (?:OTC|CH)-匹配或字符序列的非捕获组OTCCH
  • _- 一个_字符
  • .*- 除换行符以外的任何零个或多个字符,尽可能多
  • [0-9]{8}- 八位数
  • \.- 文字点(note .匹配除换行符以外的任何字符,您必须转义.以使其匹配点)
  • csv- 一个csv字符串
  • $- 字符串结束。

推荐阅读