检查正则表达式模式匹配是否失败

Thé*_*ion 3 regex scala

我正在处理一个在字符串开头提取数字的函数.给定一个字符串,它应该返回一个case类Success(包含提取的数字Int和字符串的其余部分),以防它在开头找到一个数字,Failure否则返回一个case .

为此,我使用正则表达式模式匹配将数字和字符串的其余部分匹配为两个单独的变量.然后我将数字转换为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")
}
Run Code Online (Sandbox Code Playgroud)

pam*_*amu 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
  }
}
Run Code Online (Sandbox Code Playgroud)

让我们检查它是否适用于Scala repl

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)
Run Code Online (Sandbox Code Playgroud)

看起来很有效

让我们检查一下发生故障时会发生什么.

scala> extractNumber("qwlejqwlkje")
res1: Result = Failure
Run Code Online (Sandbox Code Playgroud)