字符串给出为
var filedate = parser("test_pb_PP_Quality_2-Report_20200707.csv");
Run Code Online (Sandbox Code Playgroud)
提取“20200707”的解析器函数如下。
def parser(filename: String):String = {
val extractDate = """(\d{8}).*""".r
val extractDate(dd) = filename;
dd;
}
Run Code Online (Sandbox Code Playgroud)
但它在线程“main” scala.MatchError 中返回错误为异常:
默认情况下,使用该.r方法创建的 Regex是锚定的,这意味着它必须匹配整个字符串。(将您的正则表达式视为包含在^and 中$)
您可以改用未锚定的正则表达式:
def parser(filename: String):String = {
val extractDate = """(\d{8})""".r.unanchored
val extractDate(dd) = filename
dd
}
Run Code Online (Sandbox Code Playgroud)
这有效,但这是不好的做法,因为如果您的输入不匹配,“解析”会抛出异常。更惯用的方法是Option[String]在调用站点返回一个并处理它。例如:
def parser(filename: String): Option[String] = {
"""\d{8}""".r.findFirstIn(filename)
}
parser("test_pb_PP_Quality_2-Report_20200707.csv") match {
case Some(datetime) => // do something
case None => // handle this case
}
Run Code Online (Sandbox Code Playgroud)