#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(_*) =>
если вы только хотите проверить, совпадает ли она, игнорируя группы.