Класс scala.util.matching.Regex
Компонент объект Regex
класс Regex extends Serializable
Конструкторы экземпляров
новый Regex(regex: String, groupNames: String*)
Компилирует регулярное выражение, заданное в виде строки, в шаблон, который может быть сопоставлен с входными данными.
Если имена групп указаны, они могут быть использованы таким образом:
val namedDate = new Regex("""(\d\d\d\d)-(\d\d)-(\d\d)""", "year", "month", "day")
val namedYears = for (m <- namedDate findAllMatchIn dates) yield m group "year"
Имена групп, переданные в конструктор, предпочтительнее встроенных имён групп при получении совпадающих групп по имени. Не все платформы поддерживают встроенные имена.
Этот конструктор не поддерживает опции как флаги, которые должны быть переданы как встроенные флаги в строку шаблона: (?idmsux-idmsux).
- regex
Регулярное выражение для компиляции.
- groupNames
Имена групп захвата.
Члены-значения
final def !=(arg0: Any): Boolean
Проверка двух объектов на неравенство.
- возвращает
trueесли !(this == that), иначе false.
- Определяющие классы
- AnyRef → Any
final def ##(): Int
Эквивалентно x.hashCode за исключением упакованных числовых типов и null. Для чисел он возвращает значение хеша, согласованное с равенством значений: если два экземпляра типа значения сравниваются как true, то ## для каждого из них вернёт одно и то же значение хеша. Для null возвращает хешкод, где null.hashCode выбрасывает NullPointerException.
- возвращает
значение хеша, согласованное с ==
- Определяющие классы
- AnyRef → Any
def +(other: String): String
- Неявный
- Этот член добавлен неявным преобразованием из Regex в any2stringadd[Regex] с помощью метода any2stringadd в scala.Predef.
- Определяющие классы
- any2stringadd
def ->[B](y: B): (Regex, B)
- Неявный
- Этот член добавлен неявным преобразованием из Regex в ArrowAssoc[Regex] с помощью метода ArrowAssoc в scala.Predef.
- Определяющие классы
- ArrowAssoc
- Аннотации
- @inline()
final def ==(arg0: Any): Boolean
Выражение x == that эквивалентно if (x eq null) that eq null else x.equals(that).
- возвращает
trueесли объект-получатель эквивалентен аргументу;falseв противном случае.
- Определяющие классы
- AnyRef → Any
def anchored: Regex
final def asInstanceOf[T0]: T0
Привести объект-получатель к типу T0.
Обратите внимание, что успешность приведения в рантайме зависит от семантики стирания Scala. Таким образом, выражение 1.asInstanceOf[String] выбросит ClassCastException в рантайме, в то время как выражение List(1).asInstanceOf[List[String]] не выбросит. В последнем примере, поскольку тип аргумента стёрся во время компиляции, невозможно проверить, соответствуют ли содержимое списка требуемому типу.
- возвращает
объект-получатель.
- Определяющие классы
- Any
- Исключения
ClassCastExceptionесли объект-получатель не является экземпляром стирания типаT0.
def clone(): AnyRef
Создать копию объекта-получателя.
Стандартная реализация метода clone зависит от платформы.
- возвращает
копию объекта-получателя.
def ensuring(cond: (Regex) ⇒ Boolean, msg: ⇒ Any): Regex
- Неявный
- Этот член добавлен неявным преобразованием из Regex в Ensuring[Regex] с помощью метода Ensuring в scala.Predef.
- Определяющие классы
- Ensuring
def ensuring(cond: (Regex) ⇒ Boolean): Regex
- Неявный
- Этот член добавлен неявным преобразованием из Regex в Ensuring[Regex] с помощью метода Ensuring в scala.Predef.
- Определяющие классы
- Ensuring
def ensuring(cond: Boolean, msg: ⇒ Any): Regex
- Неявный
- Этот член добавлен неявным преобразованием из Regex в Ensuring[Regex] с помощью метода Ensuring в scala.Predef.
- Определяющие классы
- Ensuring
def ensuring(cond: Boolean): Regex
- Неявный
- Этот член добавлен с помощью неявного преобразования из Regex в Ensuring[Regex] с помощью метода Ensuring в scala.Predef.
- Классы определений
- Ensuring
final def eq(arg0: AnyRef): Boolean
Проверяет, является ли аргумент (that) ссылкой на объект-получатель (this).
Метод eq реализует отношение эквивалентности на непустых экземплярах AnyRef, и обладает тремя дополнительными свойствами:
-
Он согласован: для любых непустых экземпляров
x и y типа AnyRef, многократные вызовы x.eq(y) последовательно возвращают true или последовательно возвращают false.Для любого непустого экземпляра x типа AnyRef, вызовы x.eq(null) и null.eq(x) возвращают false.
null.eq(null) возвращает true. При переопределении методов equals или hashCode важно обеспечить согласованность их поведения с равенством ссылок. Поэтому, если два объекта являются ссылками друг на друга (o1 eq o2), они должны быть равны друг другу (o1 == o2) и они должны хешироваться до одного и того же значения (o1.hashCode == o2.hashCode).
- возвращает
trueесли аргумент является ссылкой на объект-получатель;falseв противном случае.
- Классы определений
- AnyRef
def equals(arg0: Any): Boolean
Метод равенства для ссылочных типов. Реализация по умолчанию делегирует вызов eq.
См. также equals в scala.Any.
- возвращает
trueесли объект-получатель эквивалентен аргументу;falseв противном случае.
- Классы определений
- AnyRef → Any
def finalize(): Unit
Вызывается сборщиком мусора для объекта-получателя, когда больше нет ссылок на объект.
Подробности о том, когда и как вызывается метод finalize, а также взаимодействие между finalize и нелокальными возвратами и исключениями, зависят от платформы.
- Атрибуты
- protected[lang]
- Классы определений
- AnyRef
- Аннотации
- @throws( classOf[java.lang.Throwable] )
- Примечание
не определено SLS как член AnyRef
def findAllIn(source: CharSequence): MatchIterator
Возвращает все неперекрывающиеся совпадения данного Regex в заданной последовательности символов как scala.util.matching.Regex.MatchIterator, который является специальным scala.collection.Iterator, возвращающим совпадающие строки, но также может быть запрошен для получения дополнительной информации о последнем совпадении, таких как группы захвата и начальная позиция.
MatchIterator также может быть преобразован в итератор, возвращающий объекты типа scala.util.matching.Regex.Match, как обычно возвращает findAllMatchIn.
В случае потенциальных перекрывающихся совпадений, возвращается первое возможное совпадение, а затем следующее совпадение, которое следует за частью входных данных, потреблённой первым совпадением:
val hat = "hat[^a]+".r val hathaway = "hathatthattthatttt" val hats = hat.findAllIn(hathaway).toList // List(hath, hattth) val pos = hat.findAllMatchIn(hathaway).map(_.start).toList // List(0, 7)
Для возвращения перекрывающихся совпадений можно сформулировать регулярное выражение с просмотром вперед (?=), которое не потребляет перекрывающуюся область.
val madhatter = "(h)(?=(at[^a]+))".r
val madhats = madhatter.findAllMatchIn(hathaway).map {
case madhatter(x,y) => s"$x$y"
}.toList // List(hath, hatth, hattth, hatttt)
Попытка получить информацию о совпадении после исчерпания итератора приводит к java.lang.IllegalStateException. См. scala.util.matching.Regex.MatchIterator для деталей.
- source
Текст для поиска совпадений.
- возвращает
scala.util.matching.Regex.MatchIterator совпадающих подстрок.
for (words <- """\w+""".r findAllIn "A simple example.") yield words
def findAllMatchIn(source: CharSequence): Iterator[Match]
Возвращает все неперекрывающиеся совпадения данного регулярного выражения в заданной последовательности символов как scala.collection.Iterator объектов scala.util.matching.Regex.Match.
- source
Текст для поиска совпадений.
- возвращает
scala.collection.Iterator объектов scala.util.matching.Regex.Match для всех совпадений.
for (words <- """\w+""".r findAllMatchIn "A simple example.") yield words.start
def findFirstIn(source: CharSequence): Option[String]
Возвращает необязательную первую совпадающую строку данного Regex в заданной последовательности символов или None, если совпадения нет.
- source
Текст для поиска совпадений.
- возвращает
scala.Option первой совпадающей строки в тексте.
"""\w+""".r findFirstIn "A simple example." foreach println // prints "A"
def findFirstMatchIn(source: CharSequence): Option[Match]
Возвращает необязательное первое совпадение данного Regex в заданной последовательности символов или None, если совпадения нет.
Если совпадение успешно, то scala.util.matching.Regex.Match можно использовать для запроса дополнительной информации.
- source
Текст для поиска совпадений.
- возвращает
scala.Option scala.util.matching.Regex.Match первой совпадающей строки в тексте.
("""[a-z]""".r findFirstMatchIn "A simple example.") map (_.start) // returns Some(2), the index of the first match in the text
def findPrefixMatchOf(source: CharSequence): Option[Match]
Возвращает необязательный результат совпадения этого Regex в начале заданной последовательности символов или None, если совпадение префикса отсутствует.
В отличие от findFirstMatchIn, этот метод будет возвращать совпадение только в начале входных данных.
- source
Текст для поиска совпадения.
- returns
A scala.Option результата совпадения scala.util.matching.Regex.Match сопоставленной строки.
"""\w+""".r findPrefixMatchOf "A simple example." map (_.after) // returns Some(" simple example.")
def findPrefixOf(source: CharSequence): Option[String]
Возвращает необязательный результат совпадения этого Regex в начале заданной последовательности символов или None, если совпадение префикса отсутствует.
В отличие от findFirstIn, этот метод будет возвращать совпадение только в начале входных данных.
- source
Текст для поиска совпадения.
- returns
A scala.Option сопоставленного префикса.
"""\p{Lower}""".r findPrefixOf "A simple example." // returns None, since the text does not begin with a lowercase letter
def formatted(fmtstr: String): String
Возвращает строку, отформатированную в соответствии с заданной format строкой. Форматные строки аналогичны String.format (@see java.lang.String.format).
- Неявный
- Этот член добавляется неявным преобразованием из Regex в StringFormat[Regex] с помощью метода StringFormat в scala.Predef.
- Definition Classes
- StringFormat
- Annotations
- @inline()
final def getClass(): Class[_]
Возвращает представление класса объекта во время выполнения.
- returns
объект класса, соответствующий типу получателя во время выполнения.
def hashCode(): Int
Метод hashCode для ссылочных типов. См. hashCode в scala.Any.
- returns
значение хэш-кода для данного объекта.
final def isInstanceOf[T0]: Boolean
Проверяет, соответствует ли динамический тип объекта получателя типу T0.
Обратите внимание, что результат проверки зависит от стирания типов в Scala. Следовательно, выражение 1.isInstanceOf[String] вернёт false, а выражение List(1).isInstanceOf[List[String]] вернёт true. В последнем примере, из-за стирания типа в процессе компиляции, невозможно проверить, относятся ли элементы списка к указанному типу.
- returns
true, если объект получателя является экземпляром стёртого типа
T0; false в противном случае.
- Definition Classes
- Any
final def ne(arg0: AnyRef): Boolean
Эквивалентно !(this eq that).
- returns
true, если аргумент не является ссылкой на объект-получатель; false в противном случае.
- Definition Classes
- AnyRef
final def notify(): Unit
Разбуживает один поток, ожидающий на мониторе объекта-получателя.
- Definition Classes
- AnyRef
- Annotations
- @native()
- Note
не указано SLS как член AnyRef
final def notifyAll(): Unit
Разбуживает все потоки, ожидающие на мониторе объекта-получателя.
- Definition Classes
- AnyRef
- Annotations
- @native()
- Note
не указано SLS как член AnyRef
val pattern: Pattern
def regex: String
def replaceAllIn(target: CharSequence, replacer: (Match) ⇒ String): String
Заменяет все совпадения с помощью функции замены. Функция replacer принимает scala.util.matching.Regex.Match, чтобы получить дополнительную информацию из совпадения. Например:
import scala.util.matching.Regex
val datePattern = new Regex("""(\d\d\d\d)-(\d\d)-(\d\d)""", "year", "month", "day")
val text = "From 2011-07-15 to 2011-07-17"
val repl = datePattern replaceAllIn (text, m => s"${m group "month"}/${m group "day"}")
В строке замены знак доллара ($) за которым следует число будет интерпретироваться как ссылка на группу в сопоставленном шаблоне, при этом числа от 1 до 9 соответствуют первым девяти группам, а 0 — всему совпадению. Любой другой символ является ошибкой. Символ обратного слэша (\) будет интерпретироваться как символ экранирования и может использоваться для экранирования знака доллара. Используйте Regex.quoteReplacement для экранирования этих символов.
- target
Строка для поиска совпадения.
- replacer
Функция, которая сопоставляет совпадение с другой строкой.
- returns
Строка target после замен.
def replaceAllIn(target: CharSequence, replacement: String): String
Заменяет все совпадения строкой.
В строке replacement знак доллара ($) за которым следует число будет интерпретироваться как ссылка на группу в сопоставленном шаблоне, при этом числа от 1 до 9 соответствуют первым девяти группам, а 0 — всему совпадению. Любой другой символ является ошибкой. Знак обратного слэша (\) интерпретируется как символ экранирования и может использоваться для экранирования знака доллара. Используйте Regex.quoteReplacement для экранирования этих символов.
- target
Строка для сопоставления
- replacement
Строка, которая будет заменять каждое совпадение
- returns
Результат строки
"""\d+""".r replaceAllIn ("July 15", "<NUMBER>") // returns "July <NUMBER>"
def replaceFirstIn(target: CharSequence, replacement: String): String
Заменяет первое совпадение строкой.
В строке replacement знак доллара ($) за которым следует число будет интерпретироваться как ссылка на группу в сопоставленном шаблоне, при этом числа от 1 до 9 соответствуют первым девяти группам, а 0 — всему совпадению. Любой другой символ является ошибкой. Знак обратного слэша (\) интерпретируется как символ экранирования и может использоваться для экранирования знака доллара. Используйте Regex.quoteReplacement для экранирования этих символов.
- target
Строка для сопоставления
- replacement
Строка, которая заменит совпадение
- returns
Результат строки
def replaceSomeIn(target: CharSequence, replacer: (Match) ⇒ Option[String]): String
Заменяет некоторые совпадения с использованием функции replacer, которая возвращает scala.Option. Функция replacer принимает scala.util.matching.Regex.Match для получения дополнительной информации из совпадения. Например:
import scala.util.matching.Regex._
val vars = Map("x" -> "a var", "y" -> """some $ and \ signs""")
val text = "A text with variables %x, %y and %z."
val varPattern = """%(\w+)""".r
val mapper = (m: Match) => vars get (m group 1) map (quoteReplacement(_))
val repl = varPattern replaceSomeIn (text, mapper)
В строке replacement знак доллара ($) за которым следует число будет интерпретироваться как ссылка на группу в сопоставленном шаблоне, при этом числа от 1 до 9 соответствуют первым девяти группам, а 0 — всему совпадению. Любой другой символ является ошибкой. Знак обратного слэша (\) интерпретируется как символ экранирования и может использоваться для экранирования знака доллара. Используйте Regex.quoteReplacement для экранирования этих символов.
- target
Строка для сопоставления.
- replacer
Функция, которая необязательно отображает совпадение на другую строку.
- returns
Строка target после замен.
def runMatcher(m: Matcher): Boolean
- Attributes
- protected
def split(toSplit: CharSequence): Array[String]
Разделяет предоставленную последовательность символов вокруг совпадений этого регулярного выражения.
- toSplit
Последовательность символов, которую нужно разделить
- returns
Массив строк, вычисленный путем разделения входных данных вокруг совпадений этого регулярного выражения
final def synchronized[T0](arg0: ⇒ T0): T0
- Definition Classes
- AnyRef
def toString(): String
Строка, определяющая регулярное выражение
- returns
Строковое представление объекта.
def unanchored: UnanchoredRegex
Создает новый Regex с тем же шаблоном, но без требования, что вся строка должна совпадать в шаблонах экстрактора.
Обычно сопоставление с date ведет себя так, как будто шаблон был заключен в якоря, "^pattern$". .
Неякоренное Regex ведет себя так, как будто эти якоря были удалены.
Обратите внимание, что этот метод не на самом деле удаляет какие-либо совпадения из шаблона.
Вызов anchored возвращает исходный Regex.
val date = """(\d\d\d\d)-(\d\d)-(\d\d)""".r.unanchored
val date(year, month, day) = "Date 2011-07-15" // OK
val copyright: String = "Date of this document: 2011-07-15" match {
case date(year, month, day) => s"Copyright $year" // OK
case _ => "No copyright"
}
- returns
Новый не якоренный Regex
def unapplySeq(m: Match): Option[List[String]]
Пытается сопоставить scala.util.matching.Regex.Match.
Предыдущее неудачное сопоставление приводит к None.
Если успешное сопоставление было сделано с текущим шаблоном, то этот результат используется.
В противном случае этот Regex применяется к ранее сопоставленному входу, и результат этого сопоставления используется.
def unapplySeq(c: Char): Option[List[Char]]
Пытается сопоставить строковое представление scala.Char.
Если сопоставление успешно, результатом является первая совпадающая группа, если группы определены, или пустая последовательность в противном случае.
Например:
val cat = "cat"
// the case must consume the group to match
val r = """(\p{Lower})""".r
cat(0) match { case r(x) => true }
cat(0) match { case r(_) => true }
cat(0) match { case r(_*) => true }
cat(0) match { case r() => true } // no match
// there is no group to extract
val r = """\p{Lower}""".r
cat(0) match { case r(x) => true } // no match
cat(0) match { case r(_) => true } // no match
cat(0) match { case r(_*) => true } // matches
cat(0) match { case r() => true } // matches
// even if there are multiple groups, only one is returned
val r = """((.))""".r
cat(0) match { case r(_) => true } // matches
cat(0) match { case r(_,_) => true } // no match
- c
Символ для сопоставления
- returns
Совпадение
def unapplySeq(s: CharSequence): Option[List[String]]
Пытается сопоставить java.lang.CharSequence.
Если сопоставление успешно, результатом является список сопоставленных групп (или элемент null, если ни одна группа не сопоставилась с вводом). Если шаблон не определяет групп, то результатом при успешном сопоставлении будет пустой список.
По умолчанию этот метод пытается сопоставить весь ввод; чтобы найти следующее сопоставленное подпоследовательность, используйте неякорящуюся Regex.
Например:
val p1 = "ab*c".r
val p1Matches = "abbbc" match {
case p1() => true // no groups
case _ => false
}
val p2 = "a(b*)c".r
val p2Matches = "abbbc" match {
case p2(_*) => true // any groups
case _ => false
}
val numberOfB = "abbbc" match {
case p2(b) => Some(b.length) // one group
case _ => None
}
val p3 = "b*".r.unanchored
val p3Matches = "abbbc" match {
case p3() => true // find the b's
case _ => false
}
val p4 = "a(b*)(c+)".r
val p4Matches = "abbbcc" match {
case p4(_*) => true // multiple groups
case _ => false
}
val allGroups = "abbbcc" match {
case p4(all @ _*) => all mkString "/" // "bbb/cc"
case _ => ""
}
val cGroup = "abbbcc" match {
case p4(_, c) => c
case _ => ""
}
- s
Строка для сопоставления
- returns
Сопоставления
final def wait(): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
final def wait(arg0: Long, arg1: Int): Unit
- Definition Classes
- AnyRef
- Annotations
- @throws( ... )
final def wait(arg0: Long): Unit
def →[B](y: B): (Regex, B)
- Неявный
- Этот член добавлен благодаря неявной конвертации из Regex в ArrowAssoc[Regex] с помощью метода ArrowAssoc в scala.Predef.
- Definition Classes
- ArrowAssoc
© 2002-2019 EPFL, with contributions from Lightbend.
Licensed under the Apache License, Version 2.0.
https://www.scala-lang.org/api/2.12.9/scala/util/matching/Regex.html
Регулярное выражение используется для определения, соответствует ли строка шаблону, и, если соответствует, для извлечения или преобразования совпадающих частей.
Использование
Этот класс делегирует пакету 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)Чтобы найти все совпадения:
Чтобы пройтись по совпадающим строкам, используйте
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, представляющем «текущее совпадение».Пример показывает, что методы
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" })java.util.regex.Pattern