- Введение в регулярные выражения Kotlin и шаблоны
- Конструктор регулярных выражений Kotlin
- Regex функции
- Проверка класса Regex, содержащего входной шаблон
- Пример регулярного выражения containsMatchIn()
- Пример регулярного выражения Matches(input: CharSequence): Boolean
- Пример matchEntire(input: CharSequence): MatchResult?
- Регулярное выражение offfind(input: CharSequence, startIndex: Int = 0): MatchResult?
- ofreplace(input: CharSequence, replacement: String): String
- Регулярное выражение ofreplaceFirst(input: CharSequence, replacement: String): String
- Regex шаблоны
- Мета-символы регулярного выражения
- Шаблоны квантификаторов
- Шаблоны регулярных выражений
- 6.5. Основы Kotlin. Регулярные выражения RegExp
- Возможности языка регулярных выражений
Введение в регулярные выражения Kotlin и шаблоны
Regex относится к регулярному выражению, которое используется для поиска строки или замены в объекте регулярного выражения. Чтобы использовать эту функциональность, нам нужно использовать класс Regex(шаблон: строка). Класс KotlinRegex находится в пакете kotlin.text.regex.
Рассмотрим введение в регулярные выражения Kotlin и их шаблоны.
Конструктор регулярных выражений Kotlin
Regex(pattern: String) | Создает регулярное выражение из заданного строкового шаблона. |
Regex(pattern: String, option: RegexOption) | Он создает регулярное выражение из заданного шаблона строки и данного единственного параметра. |
Regex(pattern: String, options: Set) | Создается регулярное выражение из заданного шаблона строки и набора заданных параметров. |
Regex функции
Функции | Описания |
---|---|
fun containsMatchIn(input: CharSequence): Boolean | Указывает, что регулярное выражение содержит хотя бы один входной символ. |
fun find( input: CharSequence, startIndex: Int = 0 ): MatchResult? | Возвращает первое совпадение регулярного выражения во входной последовательности символов, начиная с заданного startIndex. |
fun findAll( input: CharSequence, startIndex: Int = 0 ): Sequence | Возвращает все вхождения регулярного выражения во входную строку, начиная с заданного startIndex. |
funmatchEntire(input: CharSequence): MatchResult? | Используется для сопоставления полного входного символа из шаблона. |
infix fun matches(input: CharSequence): Boolean | Указывает, соответствует ли в регулярном выражении вся введенная последовательность символов. |
fun replace(input: CharSequence, replacement: String): String | Заменяет всю входную последовательность символов регулярного выражения заданной строкой замены. |
fun replaceFirst( input: CharSequence, replacement: String ): String | Заменит первое вхождение регулярного выражения в данной входной строке заданной строкой замены. |
fun split(input: CharSequence, limit: Int = 0): List | Разбивает входную последовательность символов регулярного выражения. |
fun toPattern(): Pattern fun toString(): String | Возвращает регулярное выражение в виде строки. |
Проверка класса Regex, содержащего входной шаблон
Результат функции Regex основан на сопоставлении шаблона регулярного выражения и входной строки. Некоторые функции проверяют частичное совпадение, а некоторые — полное.
Пример регулярного выражения containsMatchIn()
Пример регулярного выражения Matches(input: CharSequence): Boolean
Matches(input: CharSequence): логическая функция регулярного выражения проверяет совпадения всех входных последовательностей символов в регулярном выражении.
Пример matchEntire(input: CharSequence): MatchResult?
Функция matchEntire() используется для сопоставления полного входного символа из шаблона.
Регулярное выражение offfind(input: CharSequence, startIndex: Int = 0): MatchResult?
Функция find используется для поиска последовательности входных символов из объекта регулярного выражения.
fun main(args: Array)< val emailParttern = Regex("""\w+@[a-zA-Z_]+?\.[a-zA-Z]""") val email :String? = emailParttern.find("this is my email mymail@google.com")?.value println(email) val phoneNumber :String? = Regex(pattern = """\d-\d-\d""") .find("phone: 123-456-7890, e..")?.value println(phoneNumber) >
[email protected] 123-456-7890
offfindAll(input: CharSequence, startIndex: Int = 0): Sequence
Функция регулярного выражения findAll() возвращает последовательность результатов совпадения на основе предоставленного шаблона.
fun main(args: Array) < val foundResults = Regex("""\d+""").findAll("ab12cd34ef 56gh7 8i") val result = StringBuilder() for(findText in foundResults) < result.append(findText.value + " ") >println(result) >
ofreplace(input: CharSequence, replacement: String): String
Функция регулярного выражения replace() заменяет все совпадающие шаблоны из входной последовательности символов указанной строкой замены.
Регулярное выражение ofreplaceFirst(input: CharSequence, replacement: String): String
Функция регулярного выражения replaceFirst() заменяет первое вхождение совпадающего шаблона из входной последовательности символов указанной строкой замены.
nature is awesome, beautiful is nature
ofsplit(input: CharSequence, limit: Int = 0): List
Функция regex split() разбивает входную последовательность символов в соответствии с предоставленным шаблоном. Это значение разделения возвращается в список.
[ab, cd, ef] [nothing match to split]
Regex шаблоны
Regex использует несколько символических обозначений(шаблонов) в своей функции в Котлин. Некоторые часто используемые шаблоны приведены ниже:
Символ | Описание |
---|---|
x|у | Соответствует либо x, либо y |
xу | Соответствует x, за которым следует y |
[xyz] | Соответствует x,y,z |
[xz] | Соответствует любому символу от x до z |
[^xz] | ‘^’ в качестве первого символа отменяет шаблон. Это соответствует всему, что находится за пределами диапазона xz |
^xyz | Соответствует выражению xyz в начале строки |
xyz$ | Соответствует выражению xyz в конце строки |
. | Соответствует любому одиночному символу |
Мета-символы регулярного выражения
Символ | Описание |
---|---|
\d | Соответствует цифрам(6) |
\D | Не содержит цифры |
\w | Соответствует символам слова |
\W | Соответствует символам, не являющимся словами |
\s | Соответствует пробелам [\t\r\f\n] |
\S | Соответствует непробельным символам |
\b | Соответствует границе слова вне скобок. Соответствует обратной косой черте при помещении в скобки |
\B | Соответствует границе слова |
\A | Соответствует началу строки |
\Z | Соответствует концу строки |
Шаблоны квантификаторов
Символ | Описание |
---|---|
abcd? | Соответствует 0 или 1 вхождению выражения abcd |
abcd* | Соответствует 0 или более вхождениям выражения abcd |
abcd+ | Соответствует 1 или более вхождениям выражения abcd |
abcd | Соответствует точному количеству x вхождений выражения abcd |
abcd | Соответствует x или более вхождениям выражения abcd |
abcd | Сопоставляет от x до y вхождений выражения abcd |
Шаблоны регулярных выражений
Шаблон | Описание |
---|---|
([^\s]+(?=\.(jpg|gif|png))\.\2) | Соответствует изображениям jpg, gif или png. |
([А-Zа-z0-9-]+) | Соответствует последнему, числу и дефису. |
(^4$|^11$|^100$) | Соответствует любому числу от 1 до 100 включительно. |
(#?([A-Fa-f0-9])(([A-Fa-f0-9]))?) | Соответствует допустимому шестнадцатеричному цветовому коду. |
((?=.*\d)(?=.*[az])(?=.*[AZ]).) | Соответствует строке от 8 до 15 символов, по крайней мере, с одним прописным регистром, одним строчным регистром и одной цифрой. |
(\w+@[a-zA-Z_]+?\.[a-zA-Z]) | Совпадает с адресом электронной почты. |
(\<(/?[^\>]+)\>) | Соответствует тегам HTML. |
6.5. Основы Kotlin. Регулярные выражения RegExp
Регулярные выражения (RegExp) — специальный язык для описания множества строк. Они помогают решать задачу поиска какого-либо текста (из описанного множества) в другом тексте, описывают интересующий нас текст и работают достаточно эффективно для быстрого решения задачи поиска.
В некоторых случаях количество вариантов искомого текста настолько велико, что перечислять все варианты становится неудобно. Иногда все эти варианты могут быть представлены одной строкой — регулярным выражением.
Примеры регулярных выражений (см. слайды):
Поиск регулярного выражения осуществляется с помощью автомата с состояниями, или конечного автомата. В данном случае под этим понимается алгоритм, имеющий некоторое количество устойчивых состояний. Для каждого состояния определяются действия, которые алгоритм выполняет в этом состоянии, а также условия, по которым алгоритм переходит в другие состояния.
Возможности языка регулярных выражений
Регулярное выражение в общем случае — это строка, в которой часть символов играет специальную роль. Но большинство символов в регулярном выражении обозначают просто самих себя. Например:
Существует однако ряд специальных символов. Например, класс символов обозначает любой символ из определённого множества:
- [0123456789] — любая цифра
- [aeiouy] — любая буква из перечисленных
- [~!@#$%^&*+-] — любой символ из перечисленных
Отрицание класса символов ищет любой символ НЕ из заданного множества:
- [^0123456789] — всё, что угодно, кроме цифры
- [^a-z] — всё, что угодно, кроме строчной латинской буквы
- [^-az] — всё, что угодно, кроме — , a , z
Классы и их отрицания, как видим, используют специальные символы […] для обозначения класса, специальный символ — для обозначения интервала символов и последовательность [^…] для обозначения отрицания.
Якоря позволяют найти начало или конец всей строки:
- ^fun — fun в начале строки
- \.$ — точка в конце строки
- ^Kotlin is great as the first language!$ — ВСЯ строка с заданной фразой (и более ничем)
Здесь ^ используется для обозначения начала строки, а $ для обозначения конца. Следует иметь в виду, что якоря никак не учитывают переводы строк — имеется в виду начало или конец всего текста, а не одной строки в тексте.
\. использует экранирование для обозначения символа . , поскольку в регулярных выражениях точка является специальным символом (и обозначает любой символ). Таким образом, \ в регулярных выражениях экранирует последующий символ, делая его из специального символа обыкновенным. Для обозначения символа \ применяется пара \\ . Аналогично, \^ обозначает символ-шапку, \$ — символ доллара, \[ — открывающую квадратную скобку, \] — закрывающую квадратную скобку.
Особые символы ищут символы по специальным правилам:
- ` ….. ` — любая последовательность из пяти символов, начинающаяся и заканчивающаяся пробелов
- \t — табуляция, \n — новая строка, \r — возврат каретки (два последних символа унаследованы компьютерами от эпохи пишущих машинок, когда для начала печати с новой строки необходимо было выполнить два действия — возврат каретки в начало строки и перевод каретки на новую строку)
- \s — произвольный вид пробела (пробел, табуляция, новая строка, возврат каретки)
- \d — произвольная цифра, аналог 2
- \w — произвольная “символ в слове”, обычно аналог [a-zA-z0-9] , то есть, латинская буква или цифра
- \S — НЕ пробел, \D — НЕ цифра, \W — НЕ “символ в слове”
Шаблон выбора | ищет одну строку из нескольких, например:
- Марат|Михаил — Марат или Михаил
- ^\[|\]$ — открывающая квадратная скобка в начале строки или закрывающая в конце
- for.(val|var). — цикл for с последующим val или var
Шаблоны количества ищут определённое число совпадений:
- .* — любое количество (в том числе ноль) любых символов
- (Марат)+ — строка Марат один или более раз (но не ноль)
- (Михаил)? — строка Михаил ноль или один раз
- (7) — последовательность из ровно четырёх любых цифр
- \w — последовательность из 8-16 “символов в слове”
Круглые скобки () задают так называемые группы поиска, объединяя несколько символов вместе.
- (Kotlin)+AsFirst — KotlinAsFirst, KotlinKotlinAsFirst, KotlinKotlinKotlinAsFirst, …
- (?:\$\$)+ — `, «, ` , …
- (\w+)\s\1 — слово, за которым следует пробел и то же самое слово.
- fun\s+(/w+)\s*\\1.\> — fun с последующими пробелами, произвольным словом в круглых скобках, пробелами и тем же словом в фигурных скобках
Здесь \1 ( \2 , \3 , …) ищет уже описанную группу поиска по её номеру внутри регулярного выражения (в данном случае — первую группу). Комбинация (?:…) задаёт группу поиска без номера. В целом, (?…) задаёт группы особого поиска:
- Марат(?=\sАхин) — Марат, за которым следует пробел и Ахин
- (?⇐Михаил\s)Глухих — Глухих, перед которым стоит Михаил с пробелом
- \d+(?![$\d]) — число, после которого НЕ стоит знак доллара
- (?