Поиск…


Идиомы для соответствия регулярных выражений при выражении

Использование неизменяемых местных жителей:

Использует меньше горизонтального пространства, но больше вертикального пространства, чем шаблон «анонимных временных». Предпочтительно по шаблону «анонимные временные», если выражение when находится в цикле - в этом случае определения регулярных выражений должны быть помещены вне цикла.

import kotlin.text.regex

var string = /* some string */

val regex1 = Regex( /* pattern */ )
val regex2 = Regex( /* pattern */ )
/* etc */

when {
    regex1.matches(string) -> /* do stuff */
    regex2.matches(string) -> /* do stuff */
    /* etc */
}

Использование анонимных времен:

Использует меньше вертикального пространства, но больше горизонтального пространства, чем шаблон «неизменяемых локалей». Не следует использовать, если тогда, when выражение находится в цикле.

import kotlin.text.regex

var string = /* some string */

when {  
    Regex( /* pattern */ ).matches(string) -> /* do stuff */
    Regex( /* pattern */ ).matches(string) -> /* do stuff */
    /* etc */
}

Использование шаблона посетителя:

Имеет преимущество тесного подражания «аргументации» when синтаксисе. Это полезно, потому что оно более четко указывает аргумент выражения when , а также исключает некоторые ошибки программиста, которые могут возникнуть из-за повторения аргумента when в каждом из whenEntry . Либо «неизменяемые местные жители», либо шаблон «анонимные временные» могут использоваться с этой реализацией шаблона посетителя.

import kotlin.text.regex

var string = /* some string */

when (RegexWhenArgument(string)) {
    Regex( /* pattern */ ) -> /* do stuff */
    Regex( /* pattern */ ) -> /* do stuff */
    /* etc */
}

А минимальное определение класса - оболочки для when это выражения аргумента:

class RegexWhenArgument (val whenArgument: CharSequence) {
    operator fun equals(whenEntry: Regex) = whenEntry.matches(whenArgument)
    override operator fun equals(whenEntry: Any?) = (whenArgument == whenEntry)
}

Введение в регулярные выражения в Котлине

В этом сообщении показано, как использовать большинство функций в классе Regex , работать с нулевым безопасным образом, связанным с функциями Regex , и как сырые строки упрощают запись и чтение шаблонов регулярных выражений.

Класс RegEx

Чтобы работать с регулярными выражениями в Kotlin, вам нужно использовать класс Regex(pattern: String) и вызывать такие функции, как find(..) или replace(..) на этот объект регулярного выражения.

Пример использования класса Regex который возвращает true, если строка input содержит c или d:

val regex = Regex(pattern = "c|d")
val matched = regex.containsMatchIn(input = "abc")    // matched: true

Существенное значение для всех функций Regex заключается в том, что результат основан на сопоставлении pattern регулярного выражения и input строки. Некоторые из функций требуют полного соответствия, в то время как для остальных требуется только частичное совпадение. Функция containsMatchIn(..) используемая в этом примере, требует частичного соответствия и объясняется позже в этом сообщении.

Нулевая безопасность с регулярными выражениями

Оба find(..) и matchEntire(..) вернут MatchResult? объект. ? символ после MatchResult необходим, чтобы Kotlin MatchResult с нулем .

Пример, демонстрирующий, как Kotlin безошибочно обрабатывает значение null из функции Regex , когда функция find(..) возвращает значение null:

val matchResult = 
    Regex("c|d").find("efg")           // matchResult: null
val a = matchResult?.value             // a: null
val b = matchResult?.value.orEmpty()   // b: ""
a?.toUpperCase()                       // Still needs question mark. => null    
b.toUpperCase()                        // Accesses the function directly. => ""

С помощью функции orEmpty() b не может быть нулевой и ? символ не нужен, когда вы вызываете функции на b .

Если вы не заботитесь об этом безопасном обращении с нулевыми значениями, Kotlin позволяет работать с нулевыми значениями, например, на Java с помощью !! персонажи:

a!!.toUpperCase()                      // => KotlinNullPointerException

Необработанные строки в шаблонах регулярных выражений

Kotlin обеспечивает улучшение по сравнению с Java с помощью необработанной строки, которая позволяет писать чистые шаблоны регулярных выражений без двойных обратных косых черт, которые необходимы с помощью строки Java. Необработанная строка представлена ​​тройной цитатой:

"""\d{3}-\d{3}-\d{4}""" // raw Kotlin string
"\\d{3}-\\d{3}-\\d{4}"  // standard Java string

find (input: CharSequence, startIndex: Int): MatchResult?

Строка input будет сопоставлена ​​с pattern в объекте Regex . Он возвращает Matchresult? объект с первым согласованным текстом после startIndex или null если шаблон не соответствует input строке. Строка результата извлекается из MatchResult? объекта value свойства. Параметр startIndex является необязательным с значением по умолчанию 0.

Чтобы извлечь первый действительный номер телефона из строки с контактными данными:

val phoneNumber :String? = Regex(pattern = """\d{3}-\d{3}-\d{4}""")
    .find(input = "phone: 123-456-7890, e..")?.value // phoneNumber: 123-456-7890

При отсутствии действительного номера телефона во input строке переменная phoneNumber будет равна null .

findAll (вход: CharSequence, startIndex: Int): Последовательность

Возвращает все совпадения из input строки, которая соответствует pattern регулярного выражения.

Чтобы распечатать все номера, разделенные пробелом, из текста с буквами и цифрами:

val matchedResults = Regex(pattern = """\d+""").findAll(input = "ab12cd34ef")
val result = StringBuilder()
for (matchedText in matchedResults) {
    result.append(matchedText.value + " ")
}

println(result) // => 12 34

Переменная matchedResults представляет собой последовательность с объектами MatchResult . С помощью строки input без цифр функция findAll(..) вернет пустую последовательность.

matchEntire (вход: CharSequence): MatchResult?

Если все символы input строки соответствуют pattern регулярного выражения, будет возвращена строка, равная input . Else, null будет возвращен.

Возвращает входную строку, если вся строка ввода - это число:

val a = Regex("""\d+""").matchEntire("100")?.value             // a: 100
val b = Regex("""\d+""").matchEntire("100 dollars")?.value     // b: null

match (input: CharSequence): Boolean

Возвращает true, если вся строка ввода соответствует шаблону регулярного выражения. В противном случае.

Тесты, если две строки содержат только цифры:

val regex = Regex(pattern = """\d+""")
regex.matches(input = "50")             // => true
regex.matches(input = "50 dollars")     // => false

containsMatchIn (вход: CharSequence): Boolean

Возвращает true, если часть входной строки соответствует шаблону регулярного выражения. В противном случае.

Проверьте, содержит ли две строки по крайней мере одну цифру:

Regex("""\d+""").containsMatchIn("50 dollars")       // => true
Regex("""\d+""").containsMatchIn("Fifty dollars")    // => false

split (вход: CharSequence, limit: Int): Список

Возвращает новый список без совпадений регулярных выражений.

Для возврата списков без цифр:

val a = Regex("""\d+""").split("ab12cd34ef")     // a: [ab, cd, ef]
val b = Regex("""\d+""").split("This is a test") // b: [This is a test]

В каждом списке есть один элемент списка. Первая строка input содержит три числа. Это приводит к списку с тремя элементами.

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

Заменяет все совпадения pattern регулярного выражения в строке input с помощью строки замены.

Чтобы заменить все цифры в строке на x:

val result = Regex("""\d+""").replace("ab12cd34ef", "x") // result: abxcdxef


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow