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