正则表达式

目录

一.什么是正则

二.正则表达式的用途

三.发展历史

四.正则表达式------基本格式

详细介绍:

[五.正则表达式 - 修饰符](#五.正则表达式 - 修饰符)

常见的正则表达式修饰符

六.正则表达式-元字符

基础元字符

转义字符

边界元字符

贪婪和非贪婪模式

[七.正则表达式 - 运算符优先级](#七.正则表达式 - 运算符优先级)

八.正则表达式-匹配规则

[1. 字面匹配](#1. 字面匹配)

[2. 特殊字符](#2. 特殊字符)

[3. 元字符](#3. 元字符)

[4. 边界匹配](#4. 边界匹配)

[5. 贪婪与非贪婪](#5. 贪婪与非贪婪)

[6. 修饰符](#6. 修饰符)

[7. 零宽度匹配](#7. 零宽度匹配)

九.示例


一.什么是正则

正则表达式(Regular Expression,简称regex或regexp)是一种用来描述字符串搜索和匹配模式的工具。它被广泛应用于文本处理、数据解析、字符串匹配等领域,允许用户使用简单或复杂的规则来搜索和操作文本数据。正则表达式被许多编程语言和工具支持,例如Python、JavaScript、Perl、Java、Rust、Go等。在这些语言中,你可以使用正则表达式来完成各种字符串操作任务。

二.正则表达式的用途

正则表达式的常见用途包括:

  • 搜索和查找:在文本中查找特定的模式。例如,在一段文本中查找所有包含日期的行。
  • 验证和匹配:验证文本是否符合特定的规则。例如,验证一个字符串是否是有效的电子邮件地址。
  • 替换和修改:根据匹配的模式替换文本中的内容。例如,将某个特定模式的字符串替换成另一个字符串。

三.发展历史

正则表达式的"祖先"可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。

1951 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为"神经网事件的表示法"的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为"正则集的代数"的表达式,因此采用"正则表达式"这个术语。

随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 grep 编辑器。

大致发展历史如下:

  • 1951年:计算理论的奠基人之一,美国计算机科学家Stephen Kleene首次提出了正则语言的概念,并使用形式化的方法来描述这种语言。这为正则表达式的发展奠定了理论基础。

  • 1960年代:Ken Thompson,Unix操作系统的共同创始人之一,开发了第一个实际应用正则表达式的程序,它是Unix中grep命令的一部分。这标志着正则表达式的实际应用。

  • 1970年代:Ken Thompson和Rob Pike开发了第一个正则表达式引擎,在Unix系统中广泛使用,这对正则表达式的普及起到了关键作用。

  • 1986年:Philip Hazel开发了PCRE(Perl Compatible Regular Expressions)库,它是一种正则表达式库,允许在不同编程语言中使用Perl风格的正则表达式。

  • 1997年:IEEE发布了POSIX.2标准,其中包括了正则表达式的标准规范,这使得正则表达式在不同Unix系统中的行为更加一致。

  • 2000年代以后:正则表达式在计算机编程和文本处理中变得越来越流行,支持正则表达式的编程语言和工具变得更加丰富和强大,如Perl、Python、Java、JavaScript等。

  • 当前:正则表达式仍然是文本处理和数据提取的重要工具,它在数据科学、文本分析、网络爬虫、字符串搜索和替换等领域都有广泛的应用。

四.正则表达式------基本格式

正则表达式基本格式如下所示:

bash 复制代码
/pattern/flags

pattern 表示模式,flags 表示修饰符

模式放在斜杠 /之间,斜杠后面添加修饰符,修饰符包含ì,g,m等,修饰符放在斜杠的第二个斜杠后面。

详细介绍:

模式(Pattern):

模式是正则表达式的主体部分,它由各种字符和元字符组成,定义了要匹配的文本式。例如,a-zA-Z+ 是一个模式,表示匹配一个或多个字母。

斜杠(/):

。斜杠用于包围正则表达式的模式,将其限定在两个斜杠之间。例如,/pattern/.

修饰符(Flags)

i :表示不区分大小写匹配。

g :表示全局匹配,即匹配所有而非仅匹配第一个。

m :表示多行匹配,即^和$可以匹配字符串中每一行的开头和结尾

五.正则表达式 - 修饰符

在正则表达式中,修饰符(又称标志或标记)用于调整正则表达式的行为,提供特定的匹配控制。这些修饰符可以影响正则表达式的全局性、区分大小写、匹配多行等属性。修饰符的语法在不同的编程语言和工具中可能会有所不同。

常见的正则表达式修饰符

以下是一些最常见的修饰符,以及它们的作用:

  • g(全局匹配):启用全局匹配,意味着正则表达式将继续搜索整个字符串,而不是仅仅在找到第一个匹配后停止。

  • i(忽略大小写):忽略字母的大小写。这意味着正则表达式中的字母不区分大写或小写。

  • m(多行匹配) :启用多行匹配,将正则表达式的^$视为每一行的开始和结束,而不仅仅是整个字符串的开始和结束。

  • s(单行匹配) :启用单行模式,使正则表达式中的.匹配包括换行符在内的任何字符。

  • x(扩展模式):允许在正则表达式中包含空格和注释,以增加可读性。

  • u(Unicode模式):启用对Unicode字符的全面支持,确保正则表达式能够正确处理Unicode字符。

  • U(非贪婪模式):将正则表达式中的贪婪量词变为非贪婪模式,意味着它们会尽可能匹配较少的字符。

六.正则表达式-元字符

正则表达式中的元字符(metacharacters)是具有特殊含义的字符,它们用于构建和描述复杂的字符串匹配模式。元字符是正则表达式的核心部分,它们决定了正则表达式的匹配行为和操作方式。

以下是所有主要的元字符及其含义:

基础元字符

  • .(点):匹配除换行符外的任何单个字符。在某些环境中(如单行模式),它也可以匹配换行符。
  • ^(插入符号):匹配字符串的开始。在多行模式下,它也匹配每一行的开头。
  • $(美元符号):匹配字符串的结束。在多行模式下,它也匹配每一行的结尾。
  • *(星号):匹配前一个字符零次或多次。
  • +(加号):匹配前一个字符一次或多次。
  • ?(问号):匹配前一个字符零次或一次。
  • |(竖线):逻辑或,匹配左边或右边的表达式。
  • ()(括号):用于分组和捕获子表达式,可以用于提取匹配的部分。
  • [](方括号) :用于指定字符集或字符范围。例如,[a-z]匹配小写字母,[0-9]匹配数字。
  • {}(大括号) :用于指定匹配次数,例如,{3}表示恰好三次,{1,3}表示一到三次。

转义字符

  • \(反斜杠) :用于转义元字符,以便将其视为普通字符。例如:\.用于匹配点,\*用于匹配星号。

边界元字符

  • \b(单词边界):匹配单词的边界。
  • \B(非单词边界):匹配非单词边界。
  • **\d:匹配任何数字,相当于[0-9]
  • **\D:匹配任何非数字字符。
  • **\w:匹配字母、数字、下划线,相当于[a-zA-Z0-9_]
  • **\W:匹配任何非字母、数字、下划线的字符。
  • **\s:匹配空白字符,包括空格、制表符、换行符等。
  • **\S:匹配非空白字符。

贪婪和非贪婪模式

正则表达式的量词默认是贪婪的,它们尝试匹配尽可能多的字符。使用?可以将量词转为非贪婪:

  • *?:匹配前一个字符零次或多次,但非贪婪。
  • +?:匹配前一个字符一次或多次,但非贪婪。
  • ??:匹配前一个字符零次或一次,但非贪婪。
  • {n,m}? :非贪婪地匹配前一个字符至少n次,最多m次。

七.正则表达式 - 运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。

相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:

运算符 描述
\ 转义符
(), (?:), (?=), \[\] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,"或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

以下是一些常见正则表达式运算符按照优先级从高到低的顺序:

  • 转义符号: \ 是用于转义其他特殊字符的转义符号。它具有最高的优先级。

    示例:\d\. 等,其中 \d 匹配数字,\. 匹配点号。

  • 括号: 圆括号 () 用于创建子表达式,具有高于其他运算符的优先级。

    示例:(abc)+ 匹配 "abc" 一次或多次。

  • 量词: 量词指定前面的元素可以重复的次数。

    示例:a* 匹配零个或多个 "a"。

  • 字符类: 字符类使用方括号 [] 表示,用于匹配括号内的任意字符。

    示例:[aeiou] 匹配任何一个元音字母。

  • 断言: 断言是用于检查字符串中特定位置的条件的元素。

    示例:^ 表示行的开头,$ 表示行的结尾。

  • 连接: 连接在没有其他运算符的情况下表示字符之间的简单连接。

    示例:abc 匹配 "abc"。

  • 管道: 管道符号 | 表示"或"关系,用于在多个模式之间选择一个。

    示例:cat|dog 匹配 "cat" 或 "dog"。

八.正则表达式-匹配规则

正则表达式的匹配规则指的是正则表达式如何解释和应用于文本,以确定字符串是否符合给定的模式。理解这些匹配规则对于编写有效的正则表达式至关重要。

1. 字面匹配

正则表达式可以包含字面字符,即直接匹配它们自身的字符。例如,abc 只匹配完全相同的字符串。

2. 特殊字符

正则表达式中的特殊字符具有特定的含义,用于描述复杂的匹配模式。为了匹配特殊字符本身,需要使用转义字符 \ 进行转义。

3. 元字符

正则表达式中具有特殊含义的字符包括:.*+?^$[]{}()| 等。以下是一些常见的元字符及其匹配规则:

  • . :匹配任何单个字符,除了换行符。在单行模式下(启用修饰符 s),也可以匹配换行符。
  • ^$ :分别匹配字符串的开头和结尾。在多行模式下(启用修饰符 m),它们也匹配每一行的开头和结尾。
  • *+?:分别表示匹配前一个字符零次或多次、一次或多次、零次或一次。
  • [] :用于定义字符集或字符范围。[a-z] 匹配从 az 的任意小写字母。
  • |:逻辑或,匹配其中一个表达式。
  • ():用于分组,并可用于捕获匹配的子表达式。

4. 边界匹配

正则表达式可以匹配特定位置或边界:

  • \b:匹配单词的边界。
  • \B:匹配非单词边界。
  • ^$:用于匹配字符串的开头和结尾。

5. 贪婪与非贪婪

正则表达式中的量词默认是贪婪的,这意味着它们会尽可能匹配更多字符。非贪婪匹配会尽可能匹配更少字符,通常通过在量词后面加上 ? 来实现。

  • *?:非贪婪匹配前一个字符零次或多次。
  • +?:非贪婪匹配前一个字符一次或多次。
  • ??:非贪婪匹配前一个字符零次或一次。

6. 修饰符

修饰符可以改变正则表达式的匹配规则:

  • g(全局匹配):在整个字符串中进行匹配。
  • i(忽略大小写):不区分大小写。
  • m(多行模式) :让 ^$ 匹配每一行的开头和结尾。
  • s(单行模式) :使 . 匹配包括换行符在内的任何字符。

7. 零宽度匹配

一些正则表达式匹配是零宽度的,即不消耗字符,但指示特定位置或条件。

  • ^$:匹配字符串的开头和结尾。
  • \b:匹配单词边界。
  • \B:匹配非单词边界。

九.示例

bash 复制代码
基本匹配

匹配特定单词
正则表达式:hello
匹配内容:字符串中包含 hello 的部分。
匹配特定模式
正则表达式:abc
匹配内容:字符串中包含 abc 的部分。

重复和量词

匹配任意数量的字符
正则表达式:a.*b
匹配内容:a 和 b 之间可以包含任意数量的字符。
匹配至少一次
正则表达式:a+b
匹配内容:至少一个 a 后面是 b。
匹配零次或多次
正则表达式:ab*
匹配内容:a 后面可以有零次或多次 b。
匹配可选字符
正则表达式:colou?r
匹配内容:color 或 colour。

字符集和范围

匹配一组字符中的任意一个
正则表达式:[aeiou]
匹配内容:任意元音字母。
匹配字符范围
正则表达式:[a-z]
匹配内容:小写字母。
匹配非字符集
正则表达式:[^aeiou]
匹配内容:非元音的字符。

边界匹配

匹配行的开始和结束
正则表达式:^start
匹配内容:以 start 开头的字符串。
正则表达式:end$
匹配内容:以 end 结尾的字符串。
单词边界
正则表达式:\bword\b
匹配内容:整个单词 word。

分组和引用

使用分组
正则表达式:(abc)+
匹配内容:一个或多个 abc。
使用引用
正则表达式:(\d{3})-\1
匹配内容:形式如 123-123 的字符串。

逻辑或

匹配其中之一
正则表达式:dog|cat
匹配内容:dog 或 cat。

贪婪和非贪婪匹配

贪婪匹配
正则表达式:<.*>
匹配内容:包含在 < 和 > 之间的最长字符串。

非贪婪匹配
正则表达式:<.*?>
匹配内容:包含在 < 和 > 之间的最短字符串。
相关推荐
营养充电站5 小时前
C++23 新特性在 CLion 中的实战体验
macos·docker·jupyter·正则表达式
吴声子夜歌16 小时前
正则表达式——字符组
正则表达式
天若有情67319 小时前
自制浏览器端文本批量处理小工具,支持查找替换、内容删除、正则表达式,开箱即用
正则表达式
吴声子夜歌1 天前
正则表达式——简单的模式匹配
正则表达式
吴声子夜歌1 天前
正则表达式——前后查找
正则表达式
吴声子夜歌1 天前
正则表达式参考
正则表达式
吴声子夜歌2 天前
正则表达式——常见应用软件和编程语言中的正则表达式
正则表达式
吴声子夜歌2 天前
正则表达式——使用子表达式
正则表达式
吴声子夜歌3 天前
正则表达式——重复匹配
正则表达式
吴声子夜歌3 天前
正则表达式——匹配单个字符
正则表达式