Игнорировать группы при сопоставлении нескольких шаблонов регулярных выражений в Scala - PullRequest
0 голосов
/ 25 мая 2018

Моя цель - элегантно сопоставить несколько шаблонов регулярных выражений с одной и той же строкой.Я понимаю, что для этого типа сопоставления 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
}

Теперь у меня есть следующие соображения:

  1. Как можно понять из использования подчеркивания, я нене нужно ловить определенные группы шаблона, просто любое первое совпадение.
  2. Мои настоящие шаблоны очень сложны, поэтому для удобства управления я бы предпочел хранить их как отдельные UnanchoredRegex объекты, а не рассматривать их как разные группы захвата в одном и том же шаблоне регулярных выражений.
  3. Из-за этой сложности (вложенные группы) может быть трудно отследить количество групп захвата, которое нужно вставить в оператор case SomePattern(_,_,...n).Если я не пойму это правильно, шаблон, конечно, будет молчаливо проваливаться.Это раздражает обновлять или подстраивать мои шаблоны и впоследствии отлаживать сопоставление регулярных выражений.
  4. Мне нравится краткость и элегантность синтаксиса выше, сопоставляя один раз с несколькими шаблонами, поэтому я предпочел бы сохранить это,вместо того, чтобы писать предложение match / if для каждого шаблона.

Теперь, на мой вопрос: Есть ли способ сохранить приведенный выше синтаксис, обходясь без (для моей цели) бесполезного_,_,_,... часть, соответствующая первому попаданию вместо?

1 Ответ

0 голосов
/ 25 мая 2018
Класс

Regex реализует сопоставление с unapplySeq.Это означает, что вы можете игнорировать каждую группу с шаблоном _*:

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