Scala регулярное выражение: захват между группой - PullRequest
0 голосов
/ 13 февраля 2019

В приведенном ниже регулярном выражении мне нужно «проверить» в качестве вывода, но оно дает полную строку, которая соответствует регулярному выражению.Как я могу захватить строку между двумя группами?

val pattern = """\{outer.*\}""".r

 println(pattern.findAllIn(s"try {outer.test}").matchData.map(step => step.group(0)).toList.mkString)



Input : "try {outer.test}" 
expected Output : test 
current output : {outer.test}

1 Ответ

0 голосов
/ 13 февраля 2019

Вы можете захватить эту часть, используя:

val pattern = """\{outer\.([^{}]*)\}""".r.unanchored
val s = "try {outer.test}"

val result = s match {
  case pattern(i) => i
  case _ => ""
}
println(result)

Шаблон соответствует

  • \{outer\. - буквальная {outer. подстрока
  • ([^{}]*) - Группа захвата 1: ноль или более (*) символов, отличных от { и } (см. [^{}] отрицательный класс символов)
  • \} - a } char.

ПРИМЕЧАНИЕ: если ваше регулярное выражение должно соответствовать всей строке, удалите добавленное мной .unanchored, чтобы также разрешить частичное совпадение внутри строки.

См. Scala demo online .

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

val pattern = """(?<=\{outer\.)[^{}]*""".r
val s = "try {outer.test}"
println(pattern.findFirstIn(s).getOrElse(""))
// => test

См. это демо Scala .

Здесь (?<=\{outer\.), положительный взгляд сзади, соответствует {outer., но не помещает его в значение совпадения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...