В этой главе объясняется, как 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 . Следующие команды используются для компиляции и выполнения этой программы.