【问题标题】:Splitting string using Regex and pattern matching throws an exception使用正则表达式和模式匹配拆分字符串会引发异常
【发布时间】:2013-05-03 08:45:00
【问题描述】:

你们能告诉我我在尝试使用正则表达式模式匹配进行提取时做错了什么吗?我有以下代码

val Pattern = "=".r
val Pattern(key, value) = "key=value"

我在运行时遇到以下异常

Exception in thread "main" scala.MatchError: key=value (of class java.lang.String)

【问题讨论】:

    标签: regex scala pattern-matching scala-2.10


    【解决方案1】:

    这更像是一个正则表达式问题:您的正则表达式不捕获任何组,它只匹配单个 = 字符。

    val Pattern = "([^=]*)=(.*)".r
    

    你会得到:

    scala> val Pattern(key, value) = "key=value"
    key: String = key
    value: String = value
    

    编辑

    此外,如果输入字符串为空,则不匹配。您可以更改模式以使其匹配,或者(更好)您可以使用正则表达式进行模式匹配,如下所示:

    "key=value" match {
       case Pattern(k, v) => // do something 
       case _ => // wrong input, do nothing
    }
    

    如果您真正想要的是将输入文本与正则表达式匹配的任何内容分开,也可以使用Regex.split

    scala> val Pattern = "=".r
    Pattern: scala.util.matching.Regex = =
    
    scala> val Array(key, value) = Pattern.split("key=value")
    key: String = key
    value: String = value
    

    【讨论】:

    • 我建议您在val Pattern = "([^=]*)=?(.*)".r 中添加模式的条件,以防传入空字符串。
    • @korefn 你是对的,但是保持严格的模式并使用模式匹配来进行正确的错误处理感觉更安全。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2012-02-09
    • 2017-01-09
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多