一.什么是正则表达式?
正则表达式是一种用于描述、匹配和操作文本模式的工具。
它通过特定的字符序列和符号组合来定义规则,这些规则可以精确地匹配具有特定结构或特征的文本片段。比如,可以用正则表达式来匹配特定格式的电子邮件地址、电话号码、特定的单词或短语等。
正则表达式在文本处理、数据验证、数据提取等方面有广泛应用,它提供了一种高效、灵活的方式来处理大量文本数据。常见的正则表达式符号包括点(.)表示任意字符、星号(*)表示重复零次或多次、加号(+)表示重复一次或多次、括号用于分组等。
二.元字符
以下是一些常见的正则表达式元字符:
- . :匹配任意字符(除了换行符)。
- ^ :表示匹配字符串的开头。
- $ :表示匹配字符串的结尾。
- * :匹配前面的字符零次或多次。
- + :匹配前面的字符一次或多次。
- ? :匹配前面的字符零次或一次。
- {n} :匹配前面的字符恰好 n 次。
- {n,m} :匹配前面的字符至少 n 次,至多 m 次。
- | :表示逻辑或,用于匹配多个模式中的一个。
- () :用于分组。
- \ :用于转义特殊字符。
三.字符转义
在正则表达式中,有时需要对一些具有特殊含义的字符进行转义,使其被当作普通字符来处理。
比如,要匹配一个点(.)本身,就需要写成 \. 进行转义;要匹配一个斜杠(/),就写成 \/ 。
还有像 ^、$、*、+、?、{、}、[、]、| 等这些特殊字符,如果要匹配它们自身,都需要进行转义处理。
四.重复
在正则表达式中,有多种方式表示重复:
- * 表示前面的字符或表达式出现零次或多次。
- + 表示前面的字符或表达式出现一次或多次。
- ? 表示前面的字符或表达式出现零次或一次。
- {n} 表示前面的字符或表达式恰好出现 n 次。
- {n,} 表示前面的字符或表达式出现至少 n 次。
- {n,m} 表示前面的字符或表达式出现至少 n 次且至多 m 次。
五.字符类
正则表达式中的字符类是用方括号 [] 来定义的。
在字符类中可以包含一系列具体的字符,比如 [abc] 表示匹配字符 a、b 或 c 中的任意一个。
还可以使用一些特殊的表示方法,比如:
- [a-z] 表示匹配所有小写字母。
- [A-Z] 表示匹配所有大写字母。
- [0-9] 表示匹配所有数字。
- 也可以在字符类中进行取反操作,比如 [^abc] 表示匹配除了 a、b、c 之外的任意字符。
六.分枝条件
在正则表达式中,分枝条件可以通过“|”(管道符号)来实现。
它用于表示多个不同的模式,只要其中一个模式匹配成功就满足条件。例如,“a|b”表示匹配“a”或者“b”。
七.分组
在正则表达式中,分组是通过括号 () 来实现的。
分组有以下几个主要作用:
- 提取子表达式:可以将一个复杂模式中的部分内容作为一个整体进行操作和提取。
- 应用重复操作:对分组内的内容可以单独应用重复量词(如 *、+ 等)。
- 后向引用:可以在后续的表达式中通过特定的方式引用之前分组匹配到的内容。
八.反义
正则表达式中的反义可以通过在字符类中使用特定符号来表示。一些常见的反义表示如下:
- [^0-9] 表示除了数字之外的任何字符。
- [^a-z] 表示除了小写字母之外的任何字符。
- [^A-Z] 表示除了大写字母之外的任何字符。
九.后向引用
后向引用是正则表达式中的一个重要概念。
当使用括号进行分组后,在后续的表达式中可以通过 \1、\2 等(数字表示分组的序号)来引用前面分组匹配到的内容。
比如,表达式 (\w)\1 可以匹配连续出现两次相同字母的情况。这里的 \1 就引用了前面分组中匹配到的那个字母。
十.零宽断言
零宽断言是正则表达式中很有用的特性。
有正向零宽断言和反向零宽断言:
- 正向肯定预查(Positive Lookahead):用 (?=...) 表示,它匹配后面的内容,但不消耗字符,只是进行断言。
- 正向否定预查(Negative Lookahead):用 (?!...) 表示,它断言后面不是指定的内容。
- 反向肯定预查(Positive Lookbehind):用 (?<=...) 表示,断言前面是指定的内容。
- 反向否定预查(Negative Lookbehind):用 (?<!...) 表示,断言前面不是指定的内容。
这些零宽断言在很多复杂的匹配场景中能起到精准控制的作用。
十一.负向零宽断言
负向零宽断言主要有两种:
- 正向否定预查(Negative Lookahead):表示为 (?!表达式) ,它确保接下来的字符不是匹配“表达式”的内容。
- 反向否定预查(Negative Lookbehind):表示为 (?<!表达式) ,它确保前面的字符不是匹配“表达式”的内容。
例如,^(?!.*abc).*$ 会匹配不以“abc”开头的字符串;而 .*(?<!abc)$ 会匹配不以“abc”结尾的字符串。
十二.注释
在正则表达式中,可以添加注释来提高表达式的可读性。
在一些支持正则表达式扩展的语言或工具中,可以使用 (?#注释内容) 这种形式来添加注释。
不过需要注意的是,不是所有的正则表达式实现都支持这种添加注释的方式哦。
十三.贪婪与懒惰
在正则表达式中,贪婪模式和懒惰模式主要针对重复操作符(如 *、+、? 等)。
贪婪模式是默认的模式,它会尽可能多地匹配内容。比如 a.*b ,会从 a 开始一直匹配到最后一个 b 。
懒惰模式则是在重复操作符后加上一个 ? ,它会尽可能少地匹配内容。比如 a.*?b ,会从 a 开始匹配,遇到第一个 b 就停止。
这两种模式在不同的场景下可以根据具体需求来选择使用,以达到精确匹配的目的。
十五.处理选项
以下是一些常见的正则表达式处理选项:
- 不区分大小写:很多语言或工具提供了可以使正则表达式在匹配时不区分字母大小写的选项。
- 多行模式:在处理多行文本时,影响 ^ 和 $ 的匹配行为,使其可以匹配每行的开头和结尾,而不仅仅是整个文本的开头和结尾。
十六.平衡组/递归匹配
平衡组或递归匹配是正则表达式中比较高级和复杂的概念。
它允许处理嵌套或层次结构的文本模式匹配。通过巧妙地定义和使用平衡组,可以实现对具有递归或嵌套结构的内容进行准确的解析和匹配。
例如,用于匹配嵌套括号内的内容等情况。
不过,具体的实现和用法会因使用的编程语言或正则表达式工具而有所不同。
正则表达式相关书籍,电子书资源需要在评论区留言