【发布时间】: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
}
现在,我有以下考虑:
- 从使用下划线可以看出,我不在乎 关于捕获模式的特定组,只是任何第一次匹配。
- 我的实际模式非常复杂,所以为了便于管理,我宁愿保留它们
作为单独的
UnanchoredRegex对象,而不是将它们视为 相同正则表达式模式中的不同捕获组。 - 由于这种复杂性(嵌套组),很难跟踪要放入
case SomePattern(_,_,...n)语句的捕获组的数量。如果我做错了,模式当然会默默地失败。这使得更新或调整我的模式以及随后调试正则表达式匹配变得很烦人。 - 我喜欢上述语法的简洁和优雅,通过与多个模式匹配一次,因此我更愿意保留这一点,而不是为每个模式编写匹配/if 子句。
现在,对于我的问题:有没有办法保留上面的语法,省去(对我而言)无用的_,_,_,... 部分,而是匹配任何第一次命中?
【问题讨论】:
标签: regex scala pattern-matching