Учебники

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

В этой главе объясняется, как Scala поддерживает регулярные выражения через класс Regex, доступный в пакете scala.util.matching.

Попробуйте следующий пример программы, где мы попытаемся найти слово Scala из оператора.

пример

import scala.util.matching.Regex

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

Сохраните вышеуказанную программу в Demo.scala . Следующие команды используются для компиляции и выполнения этой программы.

команда

\>scalac Demo.scala
\>scala Demo

Выход

Some(Scala)

Мы создаем String и вызываем метод r () . Scala неявно преобразует String в RichString и вызывает этот метод для получения экземпляра Regex. Чтобы найти первое совпадение регулярного выражения, просто вызовите метод findFirstIn () . Если вместо того, чтобы найти только первое вхождение, мы хотели бы найти все вхождения соответствующего слова, мы можем использовать метод findAllIn (), и в случае, если в целевой строке доступно несколько слов Scala, это вернет коллекцию всех соответствующих слова.

Вы можете использовать метод mkString () для объединения результирующего списка, и вы можете использовать конвейер (|) для поиска в маленьком и заглавном регистре Scala, а вместо этого вы можете использовать конструктор Regex или метод r () для создания шаблона.

Попробуйте следующий пример программы.

пример

import scala.util.matching.Regex

object Demo {
   def main(args: Array[String]) {
      val pattern = new Regex("(S|s)cala")
      val str = "Scala is scalable and cool"
      
      println((pattern findAllIn str).mkString(","))
   }
}

Сохраните вышеуказанную программу в Demo.scala . Следующие команды используются для компиляции и выполнения этой программы.

команда

\>scalac Demo.scala
\>scala Demo

Выход

Scala,scala

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

пример

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

Сохраните вышеуказанную программу в Demo.scala . Следующие команды используются для компиляции и выполнения этой программы.

команда

\>scalac Demo.scala
\>scala Demo

Выход

Java is scalable and cool

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

Scala наследует свой синтаксис регулярных выражений от Java, который, в свою очередь, наследует большинство функций Perl. Вот лишь несколько примеров, которых должно быть достаточно для повышения квалификации —

Ниже приведена таблица со списком всех синтаксисов метасимволов регулярных выражений, доступных в Java.

Подвыражение Матчи
^ Соответствует началу строки.
$ Соответствует концу строки.
, Соответствует любому отдельному символу, кроме новой строки. Использование опции m позволяет ему соответствовать новой строке.
[…] Соответствует любому отдельному символу в скобках.
[^ …] Соответствует любому отдельному символу не в скобках
\\ А Начало всей строки
\\ г Конец всей строки
\\ Z Конец всей строки, кроме допустимого конечного конца строки.
ре * Соответствует 0 или более вхождений предыдущего выражения.
ре + Соответствует 1 или более предыдущей вещи
повторно? Соответствует 0 или 1 вхождению предыдущего выражения.
re {n} Совпадает ровно с числом вхождений предыдущего выражения.
re {n,} Соответствует n или более вхождений предыдущего выражения.
re {n, m} Соответствует не менее n и не более m вхождений предшествующего выражения.
| б Соответствует либо a, либо b.
(Ре) Группирует регулярные выражения и запоминает сопоставленный текст.
(?: re) Группирует регулярные выражения без запоминания сопоставленного текста.
(?> re) Соответствует независимому образцу без возврата.
\\ ш Соответствует символам слова.
\\ W Соответствует несловесным персонажам.
\\ s Соответствует пробелу. Эквивалентно [\ t \ n \ r \ f].
\\ S Соответствует непробельному пространству.
\\ д Соответствует цифрам. Эквивалентно [0-9].
\\ D Соответствует нецифровым значениям.
\\ А Соответствует началу строки.
\\ Z Соответствует концу строки. Если новая строка существует, она совпадает непосредственно перед новой строкой.
\\ г Соответствует концу строки.
\\Г Точки совпадений, где последний матч закончился.
\\ п Обратная ссылка для захвата номера группы «n»
\\ Ь Соответствует границам слов, когда они выходят за скобки. Соответствует Backspace (0x08) внутри скобок.
\\ B Соответствует безсловным границам.
\\ n, \\ t и т. д. Сопоставляет переводы строк, возврат каретки, вкладки и т. Д.
\\ Q Escape (цитата) всех символов до \\ E
\\ E Завершает цитирование, начинающееся с \\ Q

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

пример Описание
, Подберите любой символ, кроме новой строки
[Rr] убий Матч «Рубин» или «Рубин»
руб [вы] Совпадение «рубин» или «рубин»
[AEIOU] Соответствует любой строчной гласной
[0-9] Сопоставить любую цифру; такой же как [0123456789]
[AZ] Совпадение с любой строчной буквой ASCII
[AZ] Совпадение с любой прописной буквой ASCII
[A-Za-Z0-9] Подходим любой из вышеперечисленных
[^ AEIOU] Совпадение с чем-либо, кроме строчной гласной
[^ 0-9] Совпадение с чем угодно, кроме цифры
\\ д Совпадение с цифрой: [0-9]
\\ D Совпадение с нецифровой цифрой: [^ 0-9]
\\ s Совпадение с пробелом: [\ t \ r \ n \ f]
\\ S Соответствие непробельному пространству: [^ \ t \ r \ n \ f]
\\ ш Совпадение с одним словом: [A-Za-z0-9_]
\\ W Соответствует несловесному символу: [^ A-Za-z0-9_]
Рубин? Совпадение «руб» или «рубин»: у необязательно
Рубин* Совпадение «руб» плюс 0 или более лет
рубин + Совпадение «руб» плюс 1 или более лет
\\ д {3} Совпадение ровно 3 цифры
\\ д {3} Совпадение 3 или более цифр
\\ д {3,5} Совпадение 3, 4 или 5 цифр
\\ D \\ D + Нет группы: + повторяется \\ d
(\\ D \\ г) + / Сгруппировано: + повторяется \\ D \ d пара
([Rr] uby (,)?) + Матч «Рубин», «Рубин, Рубин, Рубин» и др.

Обратите внимание — каждая обратная косая черта появляется дважды в строке выше. Это связано с тем, что в Java и Scala одиночная обратная косая черта является escape-символом в строковом литерале, а не обычным символом, который отображается в строке. Поэтому вместо ‘\’ вам нужно написать ‘\\’, чтобы получить один обратный слеш в строке.

Попробуйте следующий пример программы.

пример

import scala.util.matching.Regex

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

Сохраните вышеуказанную программу в Demo.scala . Следующие команды используются для компиляции и выполнения этой программы.