Поиск…
Идиомы для соответствия регулярных выражений при выражении
Использование неизменяемых местных жителей:
Использует меньше горизонтального пространства, но больше вертикального пространства, чем шаблон «анонимных временных». Предпочтительно по шаблону «анонимные временные», если выражение 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