Scala Regex несколько блокируют получение

объявление События добавляет слой абстракции и защиты на делегат экземпляр. Эта защита препятствует тому, чтобы клиенты делегата сбросили делегата и ее список вызова и только позволяет добавлять или удалять цели из списка вызова.

7
задан Community 23 May 2017 в 10:29
поделиться

2 ответа

Как сказал Алекс , при использовании сопоставления с образцом для извлечения полей из регулярных выражений образец действует так, как если бы он был ограничен (т. Е. С использованием ^ и $ ). Обычный способ избежать этой проблемы - сначала использовать findAllIn . Таким образом:

val input = """some text
              |begin {
              |  content to extract
              |  content to extract
              |}
              |some text
              |begin {
              |  other content to extract
              |}
              |some text""".stripMargin

val Block = """(?s)begin \{(.*)\}""".r

Block findAllIn input foreach (_ match {
  case Block(content) => println(content)
  case _ => println("NO MATCH")
})

В противном случае вы можете использовать . * в начале и в конце, чтобы обойти это ограничение:

val Block = """(?s).*begin \{(.*)\}.*""".r

input match {
  case Block(content) => println(content)
  case _ => println("NO MATCH")
}

Кстати, вы, вероятно, захотите неактивный сопоставитель:

val Block = """(?s)begin \{(.*?)\}""".r

Block findAllIn input foreach (_ match {
  case Block(content) => println(content)
  case _ => println("NO MATCH")
})
10
ответ дан 6 December 2019 в 23:07
поделиться

Я считаю, что при сопоставлении требуется имплицитность полного совпадения. Ваше совпадение эквивалентно:

val Block = """^(?s).*begin \{(.*)\}$""".r

Это сработает, если вы добавите. * В конец:

val Block = """(?s).*begin \{(.*)\}.*""".r

Мне не удалось найти никакой документации по этому поводу, но я столкнулся с той же проблемой.

1
ответ дан 6 December 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: