Регулярные выражения в Scala

Scala поддерживает регулярные выражения через классRegexRegex из пакета scala.util.matching. В следующем примере демонстрируется использование регулярных выражений для поиска слов.Scala :

Пример

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = "Scala".r
      val str = "Scala is Scalable and cool"
     
      println(pattern findFirstIn str)
   }
}

Выполните приведённый выше код, и результат вывода будет:

$ scalac Test.scala 
$ scala Test
Some(Scala)

В примере метод r() класса String используется для создания объекта Regex.

Затем используйте метод findFirstIn, чтобы найти первое совпадение.

Если нужно просмотреть все совпадения, можно использовать метод findAllIn.

Вы можете использовать метод mkString() для объединения строк результатов совпадений регулярного выражения, а также можете использовать вертикальную черту (|) для задания разных шаблонов:

Пример

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")  // Первая буква может быть заглавной S или строчной s
      val str = "Scala is scalable and cool"
     
      println((pattern findAllIn str).mkString(","))   // Используйте запятую , для объединения возвращённых результатов
   }
}

Выполните приведённый выше код, и результат вывода будет:

$ scalac Test.scala 
$ scala Test
Scala,scala

Если нужно заменить совпавший текст указанным ключевым словом, можно использовать методreplaceFirstIn( )для замены первого совпадения, использовать методreplaceAllIn( )для замены всех совпадений, пример ниже:

Пример

object Test {
   def main(args: Array[String]) {
      val pattern = "(S|s)cala".r
      val str = "Scala is scalable and cool"
     
      println(pattern replaceFirstIn(str, "Java"))
   }
}

Выполните приведённый выше код, и результат вывода будет:

$ scalac Test.scala 
$ scala Test
Java is scalable and cool

Регулярные выражения

Регулярные выражения Scala наследуют правила синтаксиса Java, тогда как Java в значительной степени использует правила языка Perl.

В следующей таблице приведены некоторые часто используемые правила регулярных выражений:

Выражение Правило сопоставления
^ Совпадает с позицией в начале входной строки.
$ Совпадает с позицией в конце входной строки.
. Совпадает с любым одиночным символом, кроме "\r\n".
[...] Набор символов. Совпадает с любым одним символом, входящим в набор. Например, "[abc]" совпадает с "a" в "plain".
[^...] Отрицательный набор символов. Совпадает с любым символом, не входящим в набор. Например, "[^abc]" совпадает с "p", "l", "i", "n" в "plain".
\\A Совпадает с начальной позицией входной строки (без поддержки многострочного режима)
\\z Конец строки (как $, но не зависит от параметров обработки многострочного режима)
\\Z Конец строки или линии (не зависит от параметров обработки многострочного режима)
re* Повторять ноль или более раз
re+ Повторять один или более раз
re? Повторять ноль или один раз
re{ n} Повторять ровно n раз
re{ n,}
re{ n, m} Повторять от n до m раз
a|b Сопоставить a или b
(re) Сопоставить re и захватить текст в автоматически именованную группу
(?: re) Сопоставить re, не захватывать совпавший текст и не присваивать номер группы этой группе
(?> re) Жадное подвыражение
\\w Совпадает с буквами, цифрами или символами подчёркивания
\\W Совпадает с любым символом, который не является буквой, цифрой, символом подчёркивания или китайским иероглифом
\\s Совпадает с любым пробельным символом, что эквивалентно [\t\n\r\f]
\\S Совпадает с любым символом, который не является пробельным символом
\\d Совпадает с цифрой, например [0-9]
\\D Совпадает с любым нецифровым символом
\\G Начало текущего поиска
\\n Символ новой строки
\\b Обычно позиция границы слова, но при использовании в классе символов обозначает возврат на одну позицию
\\B Соответствует позиции, которая не является началом или концом слова
\\t Символ табуляции
\\Q Открывающая кавычка:\Q(a+b)*3\EМожет соответствовать тексту "(a+b)*3".
\\E Закрывающая кавычка:\Q(a+b)*3\EМожет соответствовать тексту "(a+b)*3".

Примеры регулярных выражений

Пример Описание
. Совпадает с любым одиночным символом, кроме "\r\n".
[Rr]uby Соответствует "Ruby" или "ruby"
rub[ye] Совпадает с "ruby" или "rube"
[aeiou] Соответствует строчным буквам: aeiou
[0-9] Соответствует любой цифре, например
[a-z] Соответствует любой строчной букве ASCII
[A-Z] Соответствует любой заглавной букве ASCII
[a-zA-Z0-9] Соответствует цифрам, заглавным и строчным буквам
[^aeiou] Соответствует символам, отличным от aeiou
[^0-9] Совпадает с символами, отличными от цифр
\\d Соответствует цифре, например: [0-9]
\\D Соответствует нецифровому символу, например: [^0-9]
\\s Соответствует пробельному символу, например: [ \t\r\n\f]
\\S Соответствует непробельному символу, например: [^ \t\r\n\f]
\\w Соответствует буквам, цифрам, символам подчёркивания, например: [A-Za-z0-9_]
\\W Соответствует символам, не являющимся буквами, цифрами или подчёркиваниями, например: [^A-Za-z0-9_]
ruby? Соответствует "rub" или "ruby": y необязателен
ruby* Соответствует "rub", за которым следует ноль или более y.
ruby+ Соответствует "rub", за которым следует один или более y.
\\d{3} Совпадает ровно с 3 цифрами.
\\d{3,} Совпадает с 3 или более цифрами.
\\d{3,5} Совпадает с 3, 4 или 5 цифрами.
\\D\\d+ Без группы: + повторяет \d
(\\D\\d)+/ Группа: + повторяет пару \D\d
([Rr]uby(, )?)+ Совпадает с "Ruby", "Ruby, ruby, ruby" и т. д.

Обратите внимание, что каждый символ в приведённой выше таблице использует две обратные косые черты. Это потому, что в Java и Scala обратная косая черта в строках является экранирующим символом. Поэтому, если вы хотите вывести\, вам нужно записать это в строке как\\, чтобы получить обратную косую черту. См. следующий пример:

Пример

import scala.util.matching.Regex

object Test {
   def main(args: Array[String]) {
      val pattern = new Regex("abl[ae]\\d+")
      val str = "ablaw is able1 and cool"
     
      println((pattern findAllIn str).mkString(","))
   }
}

Выполните приведённый выше код, и результат вывода будет:

$ scalac Test.scala 
$ scala Test
able1
Другие расширения