6.5. Основы Kotlin. Регулярные выражения RegExp — Fandroid.info
Предыдущий раздел
Регулярные выражения (RegExp) — специальный язык для описания множества строк. Они помогают решать задачу поиска какого-либо текста (из описанного множества) в другом тексте, описывают интересующий нас текст и работают достаточно эффективно для быстрого решения задачи поиска.
В некоторых случаях количество вариантов искомого текста настолько велико, что перечислять все варианты становится неудобно. Иногда все эти варианты могут быть представлены одной строкой — регулярным выражением.
Примеры регулярных выражений (см. слайды):
KotlinAsFirst
[A-Z0-9._%-]@[A-Z0-9.-]+\.[A-Z]{2,}
ˆ4[0-9]{12}(?:[0-9]{3})?$
[-]?[0-9]*\.?[0-9]
<()([ˆ<])(?:>(.)<\/\1>|\s+\/>)
Поиск регулярного выражения осуществляется с помощью автомата с состояниями, или конечного автомата. обозначает символ-шапку, \$
— символ доллара, \[
— открывающую квадратную скобку,\]
— закрывающую квадратную скобку.
Особые символы ищут символы по специальным правилам:
` …..
` — любая последовательность из пяти символов, начинающаяся и заканчивающаяся пробелов\t
— табуляция,\n
— новая строка,\r
— возврат каретки (два последних символа унаследованы компьютерами от эпохи пишущих машинок, когда для начала печати с новой строки необходимо было выполнить два действия — возврат каретки в начало строки и перевод каретки на новую строку)\s
— произвольный вид пробела (пробел, табуляция, новая строка, возврат каретки)\d
— произвольная цифра, аналог[0-9]
\w
— произвольная «символ в слове», обычно аналог[a-zA-z0-9]
, то есть, латинская буква или цифра\S
— НЕ пробел,\D
— НЕ цифра,\W
— НЕ «символ в слове»
Шаблон выбора |
ищет одну строку из нескольких, например:
Марат|Михаил
— Марат или Михаил^\[|\]$
— открывающая квадратная скобка в начале строки или закрывающая в концеfor. (val|var).
— циклfor
с последующимval
илиvar
Шаблоны количества ищут определённое число совпадений:
.*
— любое количество (в том числе ноль) любых символов(Марат)+
— строка Марат один или более раз (но не ноль)(Михаил)?
— строка Михаил ноль или один раз([0-9]{4})
— последовательность из ровно четырёх любых цифр\w{8,16}
— последовательность из 8-16 «символов в слове»
Круглые скобки ()
задают так называемые группы поиска, объединяя несколько символов вместе.
(Kotlin)+AsFirst
— KotlinAsFirst, KotlinKotlinAsFirst, KotlinKotlinKotlinAsFirst, …(?:\$\$)+
—`, ``, `
, …(\w+)\s\1
— слово, за которым следует пробел и то же самое слово.fun\s+(/w+)\s*\{.\1.\}
—fun
с последующими пробелами, произвольным словом в круглых скобках, пробелами и тем же словом в фигурных скобках
Здесь \1
(\2
, \3
, …) ищет уже описанную группу поиска по её номеру внутри регулярного выражения (в данном случае — первую группу). Комбинация (?:…)
задаёт группу поиска без номера. В целом, (?…)
задаёт группы особого поиска:
Марат(?=\sАхин)
— Марат, за которым следует пробел и Ахин(?⇐Михаил\s)Глухих
— Глухих, перед которым стоит Михаил с пробелом\d+(?![$\d])
— число, после которого НЕ стоит знак доллара(?<!root\s)beer
— beer, перед которым НЕ стоит root с пробелом
Страницы: 1 2
Шпаргалка по регулярным выражениям. В примерах | by Evgeny Vladimirovich | NOP::Nuances of Programming
Регулярные выражения (regex или regexp) очень эффективны для извлечения информации из текста. Для этого нужно произвести поиск одного или нескольких совпадений по определённому шаблону (т. е. определённой последовательности символов ASCII или unicode).
Области применения regex разнообразны, от валидации до парсинга/замены строк, передачи данных в другие форматы и Web Scraping’а. Привет пока$ точное совпадение (начинается и заканчивается как Привет пока)воробушки соответствует любой строке, в которой есть текст воробушки
Квантификаторы — * + ? и {}abc* соответствует строке, в которой после ab следует 0 или более символов c -> тестabc+ соответствует строке, в которой после ab следует один или более символов cabc? соответствует строке, в которой после ab следует 0 или один символ cabc{2} соответствует строке, в которой после ab следует 2 символа cabc{2,} соответствует строке, в которой после ab следует 2 или более символов cabc{2,5} соответствует строке, в которой после ab следует от 2 до 5 символов ca(bc)* соответствует строке, в которой после ab следует 0 или более последовательностей символов bca(bc){2,5} соответствует строке, в которой после ab следует от 2 до 5 последовательностей символов bcОператор ИЛИ — | или []
a(b|c) соответствует строке, в которой после a следует b или c -> тестa[bc] как и в предыдущем примереСимвольные классы — \d \w \s и .
\d соответствует одному символу, который является цифрой -> тест\w соответствует слову (может состоять из букв, цифр и подчёркивания) -> тест\s соответствует символу пробела (включая табуляцию и прерывание строки). соответствует любому символу -> тест
Используйте оператор .
с осторожностью, так как зачастую класс или отрицаемый класс символов (который мы рассмотрим далее) быстрее и точнее.
У операторов \d
, \w
и \s
также есть отрицания ― \D, \W
и \S
соответственно.
Например, оператор \D
будет искать соответствия противоположенные \d
.
\D соответствует одному символу, который не является цифрой -> тест
Некоторые символы, например ^.
и $
вызовут совпадение в начале и конце строки ввода (line), вместо строки целиком (string).
a(bc) создаём группу со значением bc -> тестa(?:bc)* оперетор ?: отключает группу -> тестa(?<foo>bc) так, мы можем присвоить имя группе -> тест
Этот оператор очень полезен, когда нужно извлечь информацию из строк или данных, используя ваш любимый язык программирования. Любые множественные совпадения, по нескольким группам, будут представлены в виде классического массива: доступ к их значениям можно получить с помощью индекса из результатов сопоставления.
Если присвоить группам имена (используя Помните, что внутри скобочных выражений все специальные символы (включая обратную косую черту Квантификаторы ( Например, выражение Обратите внимание, что хорошей практикой считается не использовать оператор Вы можете использовать оператор отрицания ! Как вы могли убедиться, области применения регулярных выражений разнообразны. Я уверен, что вы сталкивались с похожими задачами в своей работе (хотя бы с одной из них), например такими: Перевод статьи Jonny Fox: Regex tutorial — A quick cheatsheet by examples 0 голосов 0 голосов С помощью nio мы можем проверить, является ли файл ... ПОДРОБНЕЕ ответил 14 августа 2018 г. на Яве от
Сушмита • 6,900 баллов • 2665 просмотров Вот два способа, иллюстрирующие это:
Целое число x ... ПОДРОБНЕЕ ответил 20 авг. 2019 г. на Яве от
Сираджул • 59,210 баллов • 1325 просмотров общедоступная статическая строка в обратном порядке (строка s) {
... ПОДРОБНЕЕ ответил 17 августа 2018 г. на Яве от
самарт395 • 2220 баллов • 563 просмотра ул != ноль && ул.длина() != 0
альтернативно
ул ... ПОДРОБНЕЕ (?<foo>. используется как отрицание в выражении -> тест
\
) теряют своё служебное значение, поэтому нам ненужно их экранировать.* + {}
) ― это «жадные» операторы, потому что они продолжают поиск соответствий, как можно глубже ― через весь текст.<.+>
соответствует <div>simple div</div>
в This is a <div> simple div</div> test
. Чтобы найти только тэг div
― можно использовать оператор ?
, сделав выражение «ленивым»:<.+?> соответствует любому символу, один или несколько раз найденному между < и >, расширяется по мере необходимости -> тест
.
), где предыдущий символ ― словесный (например, \w
), а следующий ― нет, либо наоборот, (например, это может быть начало строки или пробел).\B
― соответствует несловообразующей границе. Соответствие не должно обнаруживаться на границе \b
.\Babc\B соответствует, только если шаблон полностью окружён словами -> тест
Обратные ссылки — \1([abc])\1 \1 соответствует тексту из первой захватываемой группы -> тест([abc])([de])\2\1 можно использовать \2 (\3, \4, и т.д.) для определения порядкового номера захватываемой группы -> тест(?<foo>[abc])\k<foo> мы присвоили имя foo группе, и теперь ссылаемся на неё используя ― (\k<foo>). Результат, как и в первом выражении -> тест
Опережающие и ретроспективные проверки — (?=) and (?<=)
d(?=r) соответствует d, только если после этого следует r, но r не будет входить в соответствие выражения -> тест(?<=r)d соответствует d, только если перед этим есть r, но r не будет входить в соответствие выражения -> тест
d(?!r) соответствует d, только если после этого нет r, но r не будет входить в соответствие выражения -> тест(?<!r)d соответствует d, только если перед этим нет r, но r не будет входить в соответствие выражения -> тест
Как узнать, появляется ли один символ в String или нет в Java
2 ответа на этот вопрос.
Связанные вопросы в Java
ответил 11 сентября 2018 г. на Яве от Сушмита • 6 900 баллов • 574 просмотра
Двоичные арифметические операции с символами и байтами ... ПОДРОБНЕЕ
ответил 22 августа 2019 г. на Яве от Сираджул • 59 210 баллов • 3039 просмотров
- ява
- java-строки
- типов данных
- строка-java
- java-символов
Строковые объекты в Java используют кодировку UTF-16 ... ПОДРОБНЕЕ
ответил 29 мая 2018 г. на Яве от Ришаб • 3620 баллов • 343 просмотра
- ява
- java-строки
- строка-java
- java-потоков
Я бы не стал использовать URLEncoder. Помимо неправильного ... ПОДРОБНЕЕ
ответил 1 июня 2018 г. на Яве от Ришаб • 3620 баллов • 14,934 просмотра
- ява
- кодирование-в-java
- java-строки
- строка-java
Если вам не нужны пустые строки: String.