【问题标题】:Ignore groups while matching multiple Regex Patterns in Scala在 Scala 中匹配多个正则表达式模式时忽略组
【发布时间】:2018-11-04 21:00:25
【问题描述】:

我的目标是以一种优雅的方式将多个正则表达式模式匹配到同一个字符串。我知道有必要为这种类型的正则表达式匹配使用组,并且为了使用下面的匹配功能,我需要在 case SomePattern(_,_) 语句中显式捕获这些组中的每一个(例如,两个组,需要两个 @ case 语句中的 987654322@)。

import scala.util.matching.UnanchoredRegex

val regexPattern1 = "(Some)|(Pattern)".r.unanchored
val regexPattern2 = "(That)|(Other)|(pattern)".r.unanchored
val regexPattern3 = "(A)|(Whole)|(Different)|(One)".r.unanchored

"Some string to match patterns against" match {
    case regexPattern1(_,_) => 1
    case regexPattern2(_,_,_) => 2
    case regexPattern3(_,_,_,_) => 3
}

现在,我有以下考虑:

  1. 从使用下划线可以看出,我不在乎 关于捕获模式的特定组,只是任何第一次匹配。
  2. 我的实际模式非常复杂,所以为了便于管理,我宁愿保留它们 作为单独的 UnanchoredRegex 对象,而不是将它们视为 相同正则表达式模式中的不同捕获组。
  3. 由于这种复杂性(嵌套组),很难跟踪要放入case SomePattern(_,_,...n) 语句的捕获组的数量。如果我做错了,模式当然会默默地失败。这使得更新或调整我的模式以及随后调试正则表达式匹配变得很烦人。
  4. 我喜欢上述语法的简洁和优雅,通过与多个模式匹配一​​次,因此我更愿意保留这一点,而不是为每个模式编写匹配/if 子句。

现在,对于我的问题:有没有办法保留上面的语法,省去(对我而言)无用的_,_,_,... 部分,而是匹配任何第一次命中?

【问题讨论】:

    标签: regex scala pattern-matching


    【解决方案1】:

    Regex 类实现与unapplySeq 的匹配。这意味着,您可以忽略具有_* 模式的每个组:

    "Some string to match patterns against" match {
        case regexPattern1(_*) => 1
        case regexPattern2(_*) => 2
        case regexPattern3(_*) => 3
    }
    

    【讨论】:

    • 太棒了!我希望 Scala 会隐藏在某个地方的那个简单而优雅的解决方案。非常感谢!
    • 另外,如果您关心提取这些子字符串,您只需要使用组。否则,不要在模式中添加这些括号。
    猜你喜欢
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-08
    • 2019-07-14
    • 2016-05-01
    • 2012-07-24
    • 1970-01-01
    相关资源
    最近更新 更多