Regex 使用模式匹配从正则表达式中提取Int,而不提取为字符串,然后强制转换为Int

Regex 使用模式匹配从正则表达式中提取Int,而不提取为字符串,然后强制转换为Int,regex,scala,pattern-matching,Regex,Scala,Pattern Matching,我有一年,以XXYY-ZZ格式表示。例如,2020-21年将代表从2020年到2021年的一年。我需要将XXYY、YY和ZZ提取为整数,以便在以后的计算中使用 使用模式匹配和正则表达式,我可以提取我想要的字符串值,如下所示: import scala.util.matching.Regex val YearFormatRegex: Regex = "(20([1-9][0-9]))-([1-9][0-9])".r "2020-21" match {

我有一年,以
XXYY-ZZ
格式表示。例如,
2020-21年
将代表从2020年到2021年的一年。我需要将
XXYY
YY
ZZ
提取为整数,以便在以后的计算中使用

使用模式匹配和正则表达式,我可以提取我想要的字符串值,如下所示:

import scala.util.matching.Regex
val YearFormatRegex: Regex = "(20([1-9][0-9]))-([1-9][0-9])".r

"2020-21" match {
  case YearFormatRegex(fullStartYear, start, end) => println(fullStartYear, start, end)
  case _                                          => println("did not match")
}
// will print (2020, 20, 21)

但是,我需要的值为int。有没有一种方法可以将这些值提取为int,而不用到处抛出
.toInt
?我知道正则表达式专门查找数字,因此如果我可以避免的话,将它们提取为字符串,然后解析为int似乎是不必要的步骤。

如果您想简单地封装转换,一种方法可以是围绕正则表达式创建您自己的提取器对象,例如:

import scala.util.matching.Regex

object Year {
  
  private val regex: Regex = "(20([1-9][0-9]))-([1-9][0-9])".r
  
  def unapply(s: String): Option[(Int, Int, Int)] =
    s match {
      case regex(prefix, from, to) => Some((prefix.toInt, from.toInt, to.toInt))
      case _ => None
    }
  
  
}

"2020-21" match {
  case Year(fullStartYear, start, end) => fullStartYear - start + end
  case _ => 0
} // returns 2020 - 20 + 21 = 2021
您可以阅读有关提取器对象的更多信息


您可以随意使用此代码。

Regex仅对字符串进行操作。如果您需要这种类型的数据,您迟早需要将提取的字符串转换为int。@Wiktor我理解,我想我希望有一种方便的方法将其转换为int,因为它是匹配的,因为我已经可以使用上述方法提取值,为了首先匹配,它们需要是数字。