在Scala中匹配多个正则表达式模式时忽略组

时间:2018-05-25 12:45:20

标签: regex scala pattern-matching

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

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. 我喜欢上面语法的简洁和优雅,通过匹配几个模式,所以我宁愿保留它,而不是为每个模式编写match / if子句。
  5. 现在,对于我的问题:有没有办法保留上面的语法,省略(对我的目的)无用的_,_,_,...部分,匹配任何第一次点击?

1 个答案:

答案 0 :(得分:2)

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

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