一篇文章学会正则表达式(Kotlin举例)

正则表达式是一种用来匹配字符串的东西,它能够在文本中查找特定的形式,从而完成对文本的处理和分析。在许多编程语言中,正则表达式都是非常重要的一部分。

了解正则表达式

在学习正则表达式之前,咱们需求先了解一些基本概念。正则表达式由一系列字符和特别字符组成,用来匹配字符串中的形式。例如,咱们能够运用正则表达式来匹配一个电话号码、一个电子邮件地址或者一个网址。正则表达式中的一些常用特别字符包括:

  • .:匹配恣意一个字符。
  • *:匹配前面的字符零次或屡次。
  • +:匹配前面的字符一次或屡次。
  • ?:匹配前面的字符零次或一次。
  • |:表明或的联系,匹配两头恣意一边的内容。
  • ():表明分组,能够将多个字符组合成一个全体。
  • :匹配字符串的最初。
  • $:匹配字符串的结束。
  • {n}:匹配前面的字符刚好呈现 n 次。
  • {n,}:匹配前面的字符

正则表达式的基本语法

正则表达式的基本语法包括两个部分:形式和修饰符。形式是用来匹配字符串的规则,而修饰符则用来控制匹配的方式。

在 Kotlin 中,咱们能够运用 Regex 类来表明一个正则表达式。例如,下面的代码界说了一个简单的正则表达式,用来匹配一个由数字组成的字符串:

val pattern = Regex("\\d+")

在这个正则表达式中,\d 表明匹配一个数字,+ 表明匹配前面的字符一次或屡次。留意,在 Kotlin 中,咱们需求运用 \\ 来表明 \ 字符,由于 \ 在字符串中有特别的意义。

接下来,咱们能够运用 matchEntire 函数来检查一个字符串是否契合这个正则表达式:

val input = "12345"
if (pattern.matchEntire(input) != null) {
    println("Match!")
} else {
    println("No match.")
}

这个代码会输出 Match!,由于输入的字符串契合正则表达式的规则。

常见的正则表达式的高档用法

除了基本的语法之外,正则表达式还有许多高档用法,能够完成愈加杂乱的匹配和替换操作。下面是一些常用的高档用法:

1. 捕获组

捕获组是指用 () 包围起来的一部分正则表达式,能够将匹配到的内容独自提取出来。例如,下面的代码界说了一个正则表达式,用来匹配一个由姓和名组成的字符串:

val pattern = Regex("(\\w+)\\s+(\\w+)")
val input = "John Smith"
val matchResult = pattern.matchEntire(input)
if (matchResult != null) {
    val firstName = matchResult.groupValues[1]
    val lastName = matchResult.groupValues[2]
    println("First name: $firstName")
    println("Last name: $lastName")
}

在这个代码中,\\w+ 表明匹配一个或多个字母、数字或下划线,\\s+ 表明匹配一个或多个空格。groupValues 特点能够返回一个列表,其中包含了所有捕获组的内容。在这个例子中,groupValues[1] 表明第一个捕获组的内容,即姓,groupValues[2] 表明第二个捕获组的内容,即名。

2. 非捕获组

非捕获组是指用 (?:) 包围起来的一部分正则表达式,它和一般的捕获组的差异在于,非捕获组匹配到的内容不会独自提取出来。例如,下面的代码界说了一个正则表达式,用来匹配一个由单词和空格组成的字符串:

val pattern = Regex("(?:\\w+\\s+)+\\w+")
val input = "one two three four"
val matchResult = pattern.matchEntire(input)
if (matchResult != null) {
    println("Match!")
} else {
    println("No match.")
}

在这个代码中,(?:\\w+\\s+)+ 表明匹配一个或多个单词和空格组成的片段,\\w+ 表明匹配一个或多个字母、数字或下划线,\\s+ 表明匹配一个或多个空格。留意,这个正则表达式并没有运用捕获组,因而 matchResult.groupValues 的成果是一个空列表。

3. 零宽断语

零宽断语是指用 (?=)(?!) 包围起来的一部分正则表达式,它能够在匹配的时分不消耗任何字符。例如,下面的代码界说了一个正则表达式,用来匹配一个以 httphttps 最初的 URL:

val pattern = Regex("(?=http|https)\\w+")
val input = "https://www.google.com"
val matchResult = pattern.find(input)
if (matchResult != null) {
    println("Match: ${matchResult.value}")
} else {
    println("No match.")
}

在这个代码中,(?=http|https) 表明匹配一个以 httphttps 最初的字符串,可是不消耗任何字符。find 函数能够在输入字符串中查找第一个匹配的子串,返回一个 MatchResult? 类型的成果。

总结

本文介绍了正则表达式的基本概念和语法,以及一些常用的高档用法。在实践的编程中,正则表达式是一种非常有用的东西,能够帮助咱们快速地处理和分析文本数据。在 Kotlin 中,咱们能够运用 Regex 类来表明和操作正则表达式,一起还能够运用一些高档用法来完成愈加杂乱的匹配和替换操作。