Эквивалент Scala для метода регулярных выражений ‘matches’?

#regex #scala

#регулярное выражение #scala

Вопрос:

Борюсь с моим первым (когда-либо) регулярным выражением Scala здесь. Мне нужно посмотреть, соответствует ли данная строка регулярному выражению: « animal<[a-zA-Z0-9] ,[a-zA-Z0-9] > «.

Итак, несколько примеров:

 animal<0,sega>          =>    valid
animal<fizz,buzz>       =>    valid
animAl<fizz,buzz>       =>    illegal; animAl contains upper-case (and this is case-sensitive)
animal<fizz,3d>         =>    valid
animal<,3d>             =>    illegal; there needs to be something [a-zA-Z0-9]  between '<' and ','
animal<fizz,>           =>    illegal; there needs to be something [a-zA-Z0-9]  between ',' and '>'
animal<fizz,%>          =>    illegal; '%' doesn't match [a-zA-Z0-9] 
etc.
  

Моя лучшая попытка на данный момент:

 val animalRegex = "animal<[a-zA-Z0-9] ,[a-zA-Z0-9] >".r
animalRegex.findFirstIn("animal<fizz,buzz")
  

К сожалению, именно здесь я натыкаюсь на кирпичную стену. findFirstIn и все другие очевидные методы, доступные animalRegex для всех возвращаемых Option[String] типов. Я надеялся найти что-то, что возвращает логическое значение, поэтому что-то вроде:

 val animalRegex = "animal<[a-zA-Z0-9] ,[a-zA-Z0-9] >".r
if(animalRegex.matches("animal<fizz,buzz>")) {
    val leftOperand : String = getLeftOperandSomehow(...)
    val rightOperand : String = getRightOperandSomehow(...)
}
  

Итак, мне нужен эквивалент метода Java matches , а затем нужен способ доступа к «левому операнду» (то есть значению первой [a-zA-Z0-9] группы, которое в текущем случае равно « fizz «), а затем то же самое для правого / второго операнда (« buzz «). Есть идеи, где я ошибаюсь?

Ответ №1:

Чтобы иметь возможность извлекать совпадающие части из вашей строки, вам нужно будет добавить группы захвата в ваше регулярное выражение, например, так (обратите внимание на круглые скобки):

 val animalRegex = "animal<([a-zA-Z0-9] ),([a-zA-Z0-9] )>".r
  

Затем вы можете использовать сопоставление шаблонов Scala для проверки соответствия и извлечения операндов из строки:

 val str = "animal<fizz,3d>"
val result = str match {
    case animalRegex(op1,op2) => s"$op1, $op2"
    case _                    => "Did not match"
}
  

В этом примере result будет содержать "fizz, 3d"

Комментарии:

1. Какой красивый ответ. Я не знаю, почему они не предоставили matches , но scaladoc говорит A regular expression is used to determine whether a string matches a pattern and, if it does, to extract or transform the parts that match. , что идиома — это case animalRegex(_*) => если вы только хотите проверить, совпадает ли она, игнорируя группы.