正则表达式

发布于:2024-05-06 ⋅ 阅读:(23) ⋅ 点赞:(0)

目录

一.什么是正则

二.正则表达式的用途

三.发展历史

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

详细介绍:

五.正则表达式 - 修饰符 

常见的正则表达式修饰符

六.正则表达式-元字符 

基础元字符

转义字符

边界元字符

贪婪和非贪婪模式

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

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

1. 字面匹配

2. 特殊字符

3. 元字符

4. 边界匹配

5. 贪婪与非贪婪

6. 修饰符

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等。

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

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

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

/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:匹配非单词边界。

九.示例

基本匹配

匹配特定单词
正则表达式: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。

贪婪和非贪婪匹配

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

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