我正在处理一个在字符串开头提取数字的函数。给定一个字符串,它应该返回一个案例类Success
(包含Int
中提取的数字和字符串的其余部分),以防它在开头找到一个数字,并且一个案例对象Failure
否则。
为此,我使用正则表达式模式匹配将数字和字符串的其余部分匹配为两个单独的变量。然后我将数字转换为Int
并返回。
问题:当提供的字符串在开头不包含数字时,模式匹配失败但我不知道如何检测它是否失败,以及何时返回我的失败。
有什么想法吗?
这是我的代码
sealed trait Result
case class Success(expr: String, result: Int) extends Result
case object Failure extends Result
def extractNumber(str: String) : Result = {
val pattern = "([0-9]+)(.*)".r
val pattern(count, rest) = str
if (pattern match failed) //How can I do that
return Failure
val number = count.toInt
return Success(rest, number)
}
extractNumber("100banana") match {
case Success(rest, nb) => println("sucess" + nb + ";" + rest)
case Failure => println("failure")
}
答案 0 :(得分:5)
如果模式匹配,您可以安全地对字符串进行模式匹配,并提取所需的信息。
在下面pattern
可以用作提取器。阅读有关Scala提取器模式的信息。
def extractNumber(str: String) : Result = {
val pattern = "([0-9]+)(.*)".r
str match {
case pattern(a, b) => Success(b, a.toInt)
case _ => Failure
}
}
scala> :paste
// Entering paste mode (ctrl-D to finish)
sealed trait Result
case class Success(expr: String, result: Int) extends Result
case object Failure extends Result
def extractNumber(str: String) : Result = {
val pattern = "([0-9]+)(.*)".r
str match {
case pattern(a, b) => Success(b, a.toInt)
case _ => Failure
}
}
// Exiting paste mode, now interpreting.
defined trait Result
defined class Success
defined object Failure
extractNumber: (str: String)Result
scala> extractNumber("123192731qwlejqwlkje")
res0: Result = Success(qwlejqwlkje,123192731)
看起来很有效
让我们检查发生故障时会发生什么。
scala> extractNumber("qwlejqwlkje")
res1: Result = Failure
答案 1 :(得分:1)
而不是使用解构:
val pattern(count, rest) = str
尝试使用Regex API方法之一:
findFirstIn
会返回一个选项 - >如果没有,那么这就是"失败" findAllIn
返回MatchIterator
,可以告知失败信息(例如,hasNext
或其他)另一种方法是在try ... catch
内执行,并捕获 MatchError 。