【问题标题】:Check if regex pattern matching failed检查正则表达式模式匹配是否失败
【发布时间】:2017-12-13 21:58:22
【问题描述】:

我正在开发一个在字符串开头提取数字的函数。给定一个字符串,它应该返回一个 case 类 Success(包含在 Int 中提取的数字和字符串的其余部分),以防它在开头找到一个数字,否则返回一个 case Object 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")
}

【问题讨论】:

    标签: regex scala


    【解决方案1】:

    您可以安全地对字符串进行模式匹配,并在模式匹配时提取所需的信息。

    在下面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
    

    【讨论】:

      【解决方案2】:

      而不是使用解构:

      val pattern(count, rest) = str
      

      尝试使用Regex API 方法之一:

      • findFirstIn 返回一个选项 -> 如果没有,那么这是“失败”
      • findAllIn 返回一个 MatchIterator,它可以告知有关失败的信息(例如,hasNext 或其他)

      另一种方法是在try ... catch 中执行操作并捕获MatchError

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-15
        • 1970-01-01
        • 2012-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-20
        • 1970-01-01
        相关资源
        最近更新 更多