Моя цель - элегантно сопоставить несколько шаблонов регулярных выражений с одной и той же строкой.Я понимаю, что для этого типа сопоставления Regex необходимо использовать группы, и что для использования приведенных ниже функций сопоставления мне нужно явно захватить каждую из этих групп в операторе 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
}
Теперь у меня есть следующие соображения:
- Как можно понять из использования подчеркивания, я нене нужно ловить определенные группы шаблона, просто любое первое совпадение.
- Мои настоящие шаблоны очень сложны, поэтому для удобства управления я бы предпочел хранить их как отдельные
UnanchoredRegex
объекты, а не рассматривать их как разные группы захвата в одном и том же шаблоне регулярных выражений. - Из-за этой сложности (вложенные группы) может быть трудно отследить количество групп захвата, которое нужно вставить в оператор
case SomePattern(_,_,...n)
.Если я не пойму это правильно, шаблон, конечно, будет молчаливо проваливаться.Это раздражает обновлять или подстраивать мои шаблоны и впоследствии отлаживать сопоставление регулярных выражений. - Мне нравится краткость и элегантность синтаксиса выше, сопоставляя один раз с несколькими шаблонами, поэтому я предпочел бы сохранить это,вместо того, чтобы писать предложение match / if для каждого шаблона.
Теперь, на мой вопрос: Есть ли способ сохранить приведенный выше синтаксис, обходясь без (для моей цели) бесполезного_,_,_,...
часть, соответствующая первому попаданию вместо?