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