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 | Конец всей строки |
\\ Z | Конец всей строки, кроме допустимого символа конца строки. |
re * | Соответствует 0 или более вхождениям предыдущего выражения. |
re + | Соответствует 1 или более из предыдущего |
ре? | Соответствует 0 или 1 вхождению предыдущего выражения. |
re {n} | Соответствует ровно n повторениям предыдущего выражения. |
re {n,} | Соответствует n или нескольким вхождениям предыдущего выражения. |
re {n, m} | Соответствует минимум n и максимум m вхождениям предыдущего выражения. |
а | б | Соответствует либо a, либо b. |
(повторно) | Группирует регулярные выражения и запоминает совпадающий текст. |
(?: ре) | Группирует регулярные выражения без запоминания совпадающего текста. |
(?> ре) | Соответствует независимому шаблону без возврата. |
\\ w | Соответствует символам слова. |
\\ W | Соответствует несловесным символам. |
\\ с | Соответствует пробелу. Эквивалентно [\ t \ n \ r \ f]. |
\\ S | Соответствует пробелам. |
\\ d | Соответствует цифрам. Эквивалентно [0-9]. |
\\ D | Соответствует нецифровым значениям. |
\\ А | Соответствует началу строки. |
\\ Z | Соответствует концу строки. Если новая строка существует, она соответствует непосредственно перед новой строкой. |
\\ z | Соответствует концу строки. |
\\Г | Точка совпадения, в которой закончился последний матч. |
\\ п | Обратная ссылка на группу захвата номер "n" |
\\ б | Соответствует границам слова вне скобок. Соответствует пробелу (0x08) внутри скобок. |
\\ B | Соответствует границам без слов. |
\\ n, \\ t и т. д. | Соответствует символам новой строки, возврата каретки, табуляции и т. Д. |
\\ Q | Escape (кавычка) все символы до \\ E |
\\ E | Заканчивает котировку, начатую с \\ Q |
Примеры регулярных выражений
пример | Описание |
---|---|
. | Соответствует любому символу, кроме новой строки |
[Rr] уби | Матч «Рубин» или «Рубин» |
руб [ye] | Матч «рубин» или «рубин» |
[aeiou] | Соответствует любой гласной в нижнем регистре |
[0-9] | Соответствует любой цифре; то же, что и [0123456789] |
[аз] | Соответствует любой строчной букве ASCII |
[AZ] | Соответствует любой заглавной букве ASCII |
[a-zA-Z0-9] | Соответствует любому из вышеперечисленных |
[^ aeiou] | Соответствует чему-либо, кроме гласной строчной буквы |
[^ 0-9] | Сопоставьте все, кроме цифры |
\\ d | Соответствует цифре: [0-9] |
\\ D | Соответствует нецифровой: [^ 0-9] |
\\ с | Соответствует пробелу: [\ t \ r \ n \ f] |
\\ S | Соответствовать без пробелов: [^ \ t \ r \ n \ f] |
\\ w | Соответствует символу из одного слова: [A-Za-z0-9_] |
\\ W | Соответствует символу, не являющемуся словом: [^ A-Za-z0-9_] |
Рубин? | Сопоставьте "rub" или "ruby": y необязательно |
Рубин* | Соответствует "руб" плюс 0 или более лет |
рубин + | Матч "руб" плюс 1 или более лет |
\\ d {3} | Соответствует ровно 3 цифрам |
\\ d {3,} | Соответствие 3 или более цифрам |
\\ d {3,5} | Соответствие 3, 4 или 5 цифрам |
\\ D \\ d + | Нет группы: + повторяет \\ d |
(\\ D \\ d) + / | Сгруппировано: + повторяет пару \\ D \ d |
([Rr] uby (,)?) + | Матч «Рубин», «Рубин, рубин, рубин» и др. |
Note- что каждая обратная косая черта появляется дважды в строке выше. Это связано с тем, что в 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. Следующие команды используются для компиляции и выполнения этой программы.
Команда
\>scalac Demo.scala
\>scala Demo
Вывод
able1