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

3
我正在开发一个函数,用于提取字符串开头的数字。给定一个字符串,如果找到了数字,则应返回一个包含Int类型的提取的数字和剩余字符串的Success类对象;否则返回一个Failure类对象。
为此,我使用正则表达式模式匹配将数字和剩余字符串分别匹配到两个变量中。然后我将数字转换为Int并返回。
问题在于:当提供的字符串开头没有数字时,模式匹配会失败,但我不知道如何检测它失败了,并在何时返回我的Failure对象。
有什么想法吗?
以下是我的代码:
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")
}
2个回答

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 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)

看起来它正常工作。

让我们检查失败的情况会发生什么。

scala> extractNumber("qwlejqwlkje")
res1: Result = Failure

1
不使用解构:
val pattern(count, rest) = str

尝试使用正则表达式API方法之一:

  • findFirstIn 返回一个选项 -> 如果为None,则表示“失败”
  • findAllIn 返回一个MatchIterator,它可以告诉有关失败的信息(例如,hasNext或任何其他信息)

另一种方法是像您现在所做的那样,在try ... catch内执行,并捕获MatchError


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接