Spec-Zone.ru › Scala 2.13 Library

Пакет scala.util.matching

пакет matching

Члены типов

класс Regex extends Serializable

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

Использование

Этот класс делегирует пакету java.util.regex платформы Java. См. документацию для java.util.regex.Pattern для получения подробной информации о синтаксисе регулярных выражений для строк шаблонов.

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

Стандартный способ создания Regex — использование метода r, предоставляемого неявно для строк:

val date = raw"(\d{4})-(\d{2})-(\d{2})".r

Поскольку экранирование не обрабатывается в многострочных строковых литералах, использование тройных кавычек позволяет избежать необходимости экранировать символ обратного слэша, так что "\\d" можно записать как """\d""". Того же результата можно достичь с помощью определенных интерполяторов, таких как raw"\d".r или пользовательского интерполятора r"\d", который также компилирует Regex.

Извлечение

Чтобы извлечь группы захвата, когда Regex соответствует, используйте его как экстрактор в соответствии с шаблоном:

"2004-01-20" match {
  case date(year, month, day) => s"$year was a good year for PLs."
}

Чтобы проверить только то, соответствует ли Regex без учета каких-либо групп, используйте последовательность подстановочных знаков:

"2004-01-20" match {
  case date(_*) => "It's a date!"
}

Это работает, потому что экстрактор Regex генерирует последовательность строк. Извлечение только года из даты также можно выразить с помощью последовательности подстановочных знаков:

"2004-01-20" match {
  case date(year, _*) => s"$year was a good year for PLs."
}

В шаблоне соответствия Regex обычно соответствует всему вводу. Однако неопределенный Regex находит шаблон где угодно во входных данных.

val embeddedDate = date.unanchored
"Date: 2004-01-20 17:25:18 GMT (10 years, 28 weeks, 5 days, 17 hours and 51 minutes ago)" match {
  case embeddedDate("2004", "01", "20") => "A Scala is born."
}
Нахождение соответствий

Чтобы найти или заменить соответствия шаблона, используйте различные методы поиска и замены. Для каждого метода есть версия для работы со строками соответствия и другая для работы с объектами Match.

Например, сопоставление шаблонов с неопределенным Regex, как в предыдущем примере, также можно выполнить с помощью findFirstMatchIn . Методы findFirst возвращают Option, который не пустой, если соответствие найдено, или None при отсутствии соответствия:

val dates = "Important dates in history: 2004-01-20, 1958-09-05, 2010-10-06, 2011-07-15"
val firstDate = date.findFirstIn(dates).getOrElse("No date found.")
val firstYear = for (m <- date.findFirstMatchIn(dates)) yield m.group(1)

Чтобы найти все соответствия:

val allYears = for (m <- date.findAllMatchIn(dates)) yield m.group(1)

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

date.matches("2018-03-01")                     // true
date.matches("Today is 2018-03-01")            // false
date.unanchored.matches("Today is 2018-03-01") // true

Чтобы итерироваться по сопоставленным строкам, используйте findAllIn, который возвращает специальный итератор, который можно запросить для MatchData последнего соответствия:

val mi = date.findAllIn(dates)
while (mi.hasNext) {
  val d = mi.next
  if (mi.group(1).toInt < 1960) println(s"$d: An oldie but goodie.")
}

Хотя MatchIterator , возвращаемый findAllIn , используется как любой Iterator, с чередующими вызовами hasNext и next, hasNext имеет дополнительный побочный эффект — продвижение базового совпадения к следующему неиспользованному соответствию. Этот эффект виден в MatchData, представляющем «текущее соответствие».

val r = "(ab+c)".r
val s = "xxxabcyyyabbczzz"
r.findAllIn(s).start    // 3
val mi = r.findAllIn(s)
mi.hasNext              // true
mi.start                // 3
mi.next()               // "abc"
mi.start                // 3
mi.hasNext              // true
mi.start                // 9
mi.next()               // "abbc"

Пример показывает, что методы объекта MatchData , такие как start , продвинутся к первому соответствию, если необходимо. Он также показывает, что hasNext продвинется к следующему неиспользованному соответствию, если next уже вернул текущее соответствие.

Текущее MatchData можно захватить с помощью метода matchData. В качестве альтернативы, findAllMatchIn возвращает Iterator[Match], где нет взаимодействия между итератором и объектами Match , которые он уже произвел.

Обратите внимание, что findAllIn находит неперекрывающиеся соответствия. (См. findAllIn для получения дополнительных примеров.)

val num = raw"(\d+)".r
val all = num.findAllIn("123").toList  // List("123"), not List("123", "23", "3")
Замена текста

Замена текста может выполняться безусловно или в зависимости от текущего соответствия:

val redacted    = date.replaceAllIn(dates, "XXXX-XX-XX")
val yearsOnly   = date.replaceAllIn(dates, m => m.group(1))
val months      = (0 to 11).map { i => val c = Calendar.getInstance; c.set(2014, i, 1); f"$c%tb" }
val reformatted = date.replaceAllIn(dates, _ match { case date(y,m,d) => f"${months(m.toInt - 1)} $d, $y" })

Сопоставление шаблона Match с Regex, который его создал, не повторно применяет Regex. В выражении для reformatted каждое совпадение date вычисляется один раз. Но можно применить Regex к Match , полученному из другого шаблона:

val docSpree = """2011(?:-\d{2}){2}""".r
val docView  = date.replaceAllIn(dates, _ match {
  case docSpree() => "Historic doc spree!"
  case _          => "Something else happened"
})
Аннотации
@SerialVersionUID()
См. также

java.util.regex.Pattern

трайт UnanchoredRegex extends Regex

Регулярное выражение, которое находит первое соответствие при использовании в шаблоне соответствия.

См. также

Regex#unanchored

Члены значений

объект Regex extends java.io.Serializable

© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.13.0/scala/util/matching/index.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API