Введение в регулярные выражения Kotlin и шаблоны

Regex относится к регулярному выражению, которое используется для поиска строки или замены в объекте регулярного выражения. Чтобы использовать эту функциональность, нам нужно использовать класс Regex(шаблон: строка). Класс KotlinRegex находится в пакете kotlin.text.regex.

Рассмотрим введение в регулярные выражения Kotlin и их шаблоны.

Конструктор регулярных выражений Kotlin

Regex(pattern: String) Создает регулярное выражение из заданного строкового шаблона.
Regex(pattern: String, option: RegexOption) Он создает регулярное выражение из заданного шаблона строки и данного единственного параметра.
Regex(pattern: String, options: Set<RegexOption>) Создается регулярное выражение из заданного шаблона строки и набора заданных параметров.

Regex функции

Функции Описания
fun containsMatchIn(input: CharSequence): Boolean Указывает, что регулярное выражение содержит хотя бы один входной символ.
fun find(
input: CharSequence,
startIndex: Int = 0
): MatchResult?
Возвращает первое совпадение регулярного выражения во входной последовательности символов, начиная с заданного startIndex.
fun findAll(
input: CharSequence,
startIndex: Int = 0
): Sequence<MatchResult>
Возвращает все вхождения регулярного выражения во входную строку, начиная с заданного 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<String> Разбивает входную последовательность символов регулярного выражения.
fun toPattern(): Pattern
fun toString(): String
Возвращает регулярное выражение в виде строки.

Проверка класса Regex, содержащего входной шаблон

 
fun main(args: Array){ 
val regex = Regex(pattern = "ko") 
val matched = regex.containsMatchIn(input = "kotlin") 
println(matched) 
} 

Выход:

true 

Результат функции Regex основан на сопоставлении шаблона регулярного выражения и входной строки. Некоторые функции проверяют частичное совпадение, а некоторые — полное.

Пример регулярного выражения containsMatchIn()

 
fun main(args: Array){ 
 
val regex = """a([bc]+)d?""".toRegex() 
val matched = regex.containsMatchIn(input = "xabcdy") 
println(matched) 
 
} 

Выход:

true 

Пример регулярного выражения Matches(input: CharSequence): Boolean

Matches(input: CharSequence): логическая функция регулярного выражения проверяет совпадения всех входных последовательностей символов в регулярном выражении.

 
fun main(args: Array){ 
 
val regex = """a([bc]+)d?""".toRegex() 
val matched1 = regex.matches(input = "xabcdy") 
val matched2 = regex.matches(input = "xabcdyabcd") 
val matched3 = regex.matches(input = "abcd") 
println(matched1) 
println(matched2) 
println(matched3) 
} 

Выход:

false 
false 
true 

Пример matchEntire(input: CharSequence): MatchResult?

Функция matchEntire() используется для сопоставления полного входного символа из шаблона.

 
fun main(args: Array){ 
 
val regex = Regex("abcd") 
val matchResult1 = regex.matchEntire("abcd")?.value 
val matchResult2 = regex.matchEntire("abcda")?.value 
 
val matchResult3 = Regex("""\d+""").matchEntire("100")?.value   
val matchResult4 = Regex("""\d+""").matchEntire("100 dollars")?.value 
 
println(matchResult1) 
println(matchResult2) 
println(matchResult3) 
println(matchResult4) 
} 

Выход:

abcd 
null 
100 
null 

Регулярное выражение offfind(input: CharSequence, startIndex: Int = 0): MatchResult?

Функция find используется для поиска последовательности входных символов из объекта регулярного выражения.

 
fun main(args: Array){ 
 
val emailParttern = Regex("""\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6}""") 
val email :String? = emailParttern.find("this is my email mymail@google.com")?.value 
println(email) 
val phoneNumber :String? = Regex(pattern = """\d{3}-\d{3}-\d{4}""") 
            .find("phone: 123-456-7890, e..")?.value  
println(phoneNumber) 
} 

Выход:

[email protected] 
123-456-7890 

offfindAll(input: CharSequence, startIndex: Int = 0): Sequence<MatchResult>

Функция регулярного выражения 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) 
} 

Выход:

12 34 56 7 8 

ofreplace(input: CharSequence, replacement: String): String

Функция регулярного выражения replace() заменяет все совпадающие шаблоны из входной последовательности символов указанной строкой замены.

 
fun main(args: Array){ 
val replaceWith = Regex("beautiful") 
val resultString = replaceWith.replace("this picture is beautiful","awesome") 
println(resultString) 
} 

Выход:

this picture is awesome 

Регулярное выражение ofreplaceFirst(input: CharSequence, replacement: String): String

Функция регулярного выражения replaceFirst() заменяет первое вхождение совпадающего шаблона из входной последовательности символов указанной строкой замены.

 
fun main(args: Array){ 
val replaceWith = Regex("beautiful") 
val resultString = replaceWith.replaceFirst("nature is beautiful, beautiful is nature","awesome") 
println(resultString) 
} 

Выход:

nature is awesome, beautiful is nature 

ofsplit(input: CharSequence, limit: Int = 0): List<String>

Функция regex split() разбивает входную последовательность символов в соответствии с предоставленным шаблоном. Это значение разделения возвращается в список.

 
fun main(args: Array){ 
val splitedValue = Regex("""\d+""").split("ab12cd34ef") 
val nonsplited= Regex("""\d+""").split("nothing match to split" ) 
println(splitedValue) 
println(nonsplited) 
} 

Выход:

[ab, cd, ef] 
[nothing match to split] 

Regex шаблоны

Regex использует несколько символических обозначений(шаблонов) в своей функции в Котлин. Некоторые часто используемые шаблоны приведены ниже:

Символ Описание
x|у Соответствует либо x, либо y
Соответствует x, за которым следует y
[xyz] Соответствует x,y,z
[xz] Соответствует любому символу от x до z
[^xz] ‘^’ в качестве первого символа отменяет шаблон. Это соответствует всему, что находится за пределами диапазона xz
^xyz Соответствует выражению xyz в начале строки
xyz$ Соответствует выражению xyz в конце строки
. Соответствует любому одиночному символу

Мета-символы регулярного выражения

Символ Описание
\d Соответствует цифрам([0-9])
\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,} Соответствует x или более вхождениям выражения abcd
abcd {х, у} Сопоставляет от x до y вхождений выражения abcd

Шаблоны регулярных выражений

Шаблон Описание
([^\s]+(?=\.(jpg|gif|png))\.\2) Соответствует изображениям jpg, gif или png.
([А-Zа-z0-9-]+) Соответствует последнему, числу и дефису.
(^[1-9]{1}$|^[1-4]{1}[0-9]{1}$|^100$) Соответствует любому числу от 1 до 100 включительно.
(#?([A-Fa-f0-9]){3}(([A-Fa-f0-9]){3})?) Соответствует допустимому шестнадцатеричному цветовому коду.
((?=.*\d)(?=.*[az])(?=.*[AZ]).{8,15}) Соответствует строке от 8 до 15 символов, по крайней мере, с одним прописным регистром, одним строчным регистром и одной цифрой.
(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6}) Совпадает с адресом электронной почты.
(\<(/?[^\>]+)\>) Соответствует тегам HTML.

 

Оцените статью