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,因为它是匹配的,因为我已经可以使用上述方法提取值,为了首先匹配,它们需要是数字。