目录
常见的元字符
正则表达式限定符
说明 - 特例
高级1 - 多选结构
高级2 - 分组与后向引用
分组
反向引用
高级3 - 环视(零宽断言)
高级4 - 贪婪与懒惰
高级5 - 模式匹配的优先级
实例
1. 字符转义
首页 后端开发 php教程 详解正则表达式

详解正则表达式

Jul 01, 2019 pm 04:25 PM
正则表达式

详解正则表达式

正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。

相关推荐:
1. 正则表达式语法教程(含在线测试工具)
2. PHP正则表达式极速入门视频教程

元字符使用正则表达式具有处理能力。元字符既可以是放在[ ] 中的任意单个字符(如 [a]表示匹配单个小写字符 a),也可以是字符序列(如 [a-d] 表示匹配 a 、b、 c、 d 之间的任意一个字符,而 \w 表示任意英文字母和数字及下划线),常见的元字符如下:

常见的元字符

字符 描述 特别说明
. 匹配除换行符(\n)以外的任意字符 ~
[abcde] 匹配 a b c d e 之中的任意一个字符 所有字符是 的关系
[a-h] 匹配 ah之间的任意一个字符 ~
[^fgh] 不与 fgh之中的任意一个字符匹配 在 中括号[ ] 的第一个字符前加上 ^ 表示 取反
不匹配中括号里面出现的任意字符
\w 匹配大小写英文字符及数字 0 到 9 之间的任意一个及下划线,相当于[a-zA-Z0-9_] ~
\W \w 相反,相当于 [^a-zA-Z0-9_] ~
\s 匹配任意的空白符,相当于 [\f\n\r\t\v] ~
\S \s相反,相当于 [^\s] ~
\d 匹配任何 0 到 9 之间的单个数字,相当于 [0-9] ~
\D \d 相反,相当于[^0-9] ~
[\u4e00-\u9fa5] 匹配任意单个汉字(中文)(这里用的是 Unicode 编码表示的汉字) ~
\b 匹配单词的开始或结束 ~
^ 匹配字符串的开始 放在中括号的第一个字符前 则变为 取反的意思
$ 匹配字符串的结束 ~

正则表达式限定符

作用:限定这个符号前面 一个 单元 多出现的次数
单元:

  1. 如果前面出现的是一个字符的话,则这一个字符就为一个 单元
  2. 如果前面我们用小括号把一个很长的字符串括起来的话,那么整个小括号里面都算是一个 单元

上面的元字符都是针对单个字符匹配的,要想同时匹配多个字符的话,还需要借助限定符,下面是一些常见的限定符(下表中 n 和 m 都是表示 整数。)

字符 描述 特别说明
* 匹配 0 到 多 个元字符,相当于 {0,} ~
? 匹配 0 到 1 个元字符, 相当于 {0,1} ~
+ 匹配至少 1 个元字符,相当于 {1,} ~
{n} 匹配 n 个元字符 ~
{n,} 匹配至少 n 个元字符 ~
{n,m} 匹配 n 到 m 个元字符 ~
\b 匹配单词边界 ~
^ 字符串必须以指定的字符开始 ~
$ 字符串必须以指定的字符结束 ~

说明 - 特例

  1. 可以将多个元字符或者原义文本字符用括号括起来形成一个 分组,比如 ^(13)[4-9]\d{8}$ 表示任意以 13 开头的移动手机号码。
    1. abcabcabc+  表示 最后的字母 c 出现 1 次或 多次;
    2. (abcabcabc)+ 表示 整个字符串 abcabcabc 出现 1 次或 多次。
  2. 可以使用 | 来表示 的关系,例如 z|j|q 表示匹配 z 、j、q 之中的任意一个字母。其实等价于 [zjq]
    1. ab|cd|ef 表示的是:要么是 ab、要么是 cd要么是 ef
    2. a(b|cd|e)f 表示的是:以a开头,要么是 b、要么是 cd要么是 e,最后以f结尾。
    3. 总结:|) 的唯一边界是 小括号( )
  3. [0-9A-Z.?] 这个正则你如何理解?
    1. .? 出现在中括号中时,.? 将变为 普通字符,它就是 点 和 问号。你可以理解为 [ ] 的优先级要大于. 和 ? 的优先级。
    2. 此正则表达式将会完全匹配字符串 ?aaa.bbb ,记住这里 . 和 ? 被完全当做了普通字符。

高级1 - 多选结构

多选结构其实就是元字符 | (或)的使用。
界定范围:开头、结尾、小括号

正则 含义
Windows98|Windows2000|WindowsXP 匹配Windows98或者Windows2000或者WindowsXP
^Windows98|Windows2000|WindowsXP$ Windows98开头或者包含Windows2000或者以WindowsXP结尾
注意^$都包含在|的范围内,因为|的界限只有:开头、结尾、小括号
Windows(98|2000|XP) Windows然后98 或者2000或者XP

总结:多选结构可以包括很多字符,但不能超越 括号 的界限。

高级2 - 分组与后向引用

分组

  • 我们已经了解怎么重复单个字符;
  • 但如果想要重复一个字符串该怎么办?你 可以用小括号来指定子表达式(也叫做分组)
  • (\d{1,3}\.){3}\d{1,3} 简单的 IP 地址匹配表达式
  • 但是它也将匹配 256.300.888.999 这种不可能存在的 IP 地址。你能写一个更准确的正则?
  • ((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)

反向引用

  • 使用小括号指定一个子表达式(分组)后,匹配这个子表达式的文本可以被捕获,从而在表达式或其他程序中作进一步的处理。
  • 默认情况下,每个分组会自动拥有一个组号,规则是:以分组的左括号为标志,从左向右,第一个分组的组号为 1 ,第二个为 2 ,依次类推

示例:

  • \b(\w+)\b\s+\1\b 可以用来匹配重复的单词
  • 匹配诸如:where where go, tom tom happy

直白解释:
正则表达式中,前面用小括号进行划分(分组),后面把小括号匹配到的内容引用到后面来,分别用\1\2等 来表示。(第一个小括号极\1...)。如果存在 小括号嵌套小括号的情况 (\w+(.?)) 记住:这个时候要以 ( 为标志 从左往右 数小括号就可以了。

高级3 - 环视(零宽断言)

  • 环视不匹配任何字符,只匹配文本中的 特定位置。类似于\b^$ 那样。环视不会占用字符。
  • 环视分为顺序逆序两种:
    • 顺序
      • (?=exp) 位置的后面能匹配 exp。例如:(?=\d) 当前位置右边是数字。
      • (?!exp) 位置的后面不能匹配 exp。例如:(?!\d) 当前位置右边不是数字。
    • 逆序
      • (?<=exp) 位置的前面能匹配 exp。例如:(?<=\d) 当前位置左边是数字
      • (?<!exp) 位置的前面不能匹配 exp。例如:(?!\d) 当前位置左边不是数字。

高级4 - 贪婪与懒惰

  • 当正则表达式中包含能接受重复的 量词 (指定数量的代码,例如:+*{3,12} 等)时, 通常的行为是匹配尽可能多的字符
  • 正则表达式:a.*b,它将会匹配最长的以 a 开始,以 b 结束的字符串。如果用它来搜索 aabab 的话,它会匹配整个字符串 aabab,这被称为 -------贪婪匹配
  • -
  • 我们更需要 懒惰匹配,也就是匹配尽可能少的字符,前面给出的量词都可以被转化为 懒惰匹配模式, 只要在它后面加一个问号 ? 。这样 .*? 就意味着匹配任意数量的重复,但是在能使整个 匹配成功的前提下使用最少的重复
  • a.*?b 匹配最短的,以 a 开始, 以 b 结束的字符串。如果把它应用于 aabab 的话,它会匹配 aabab

总结:

贪婪与懒惰模式之间的区别就在于:懒惰模式 在量词 * 的后面多了一个 问号 ?

高级5 - 模式匹配的优先级

在使用正则表达式时,需要注意匹配的顺序。通常相同优先级 从左到右 进行计算,不同优先级的运算 先高后低。各种操作符的匹配顺序优先级 从高到低 如下表所示。

顺序 元字符 描述
1 \ 转义字符
2 ()(?:)(?=)[] 模式单元和原子表
3 *+{n}{n,}{n,m} 重复匹配
4 ^$\b\B\A\Z 边界限制
5 | 模式选择

实例

1. 字符转义

1问:要匹配字符串 333333\$33\33333 中的 \$ 正则应该怎么写?
2问:如果在 PHP 中 preg_match 函数分别用单引号双引号的表达式来匹配上面的 \$,怎么写?

答案:

  • 表达式需要的规则是 \\\$
  • 用单引号表示上面的字符串 '/\\\\\\$/'。(为方便查看我们拆分一下为 '/\\  \\  \\  $/'
  • 用双引号表示上面的字符串 "/\\\\\\\$/"。(为方便查看我们拆分一下为 "/\\  \\  \\  \$/"
  • 问什么呢?

再答:

  1. PHP 中单引号不转义任何字符,但是唯独转义 \ ,所以我们需要 6个\ 来生成表达式。
  2. 双引号除了转义 \ 以外,还需要多一个 \ 用来转义 $ 所以它 需要 7 个\

相关教程推荐:PHP视频教程

以上是详解正则表达式的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PHP正则表达式验证:数字格式检测 PHP正则表达式验证:数字格式检测 Mar 21, 2024 am 09:45 AM

PHP正则表达式验证:数字格式检测在编写PHP程序时,经常需要对用户输入的数据进行验证,其中一个常见的验证是检查数据是否符合指定的数字格式。在PHP中,可以使用正则表达式来实现这种验证。本文将介绍如何使用PHP正则表达式来验证数字格式,并提供具体的代码示例。首先,让我们看一下常见的数字格式验证要求:整数:只包含数字0-9,可以以正负号开头,不包含小数点。浮点

如何使用正则表达式在 Golang 中验证电子邮件地址? 如何使用正则表达式在 Golang 中验证电子邮件地址? May 31, 2024 pm 01:04 PM

要使用正则表达式在Golang中验证电子邮件地址,请执行以下步骤:使用regexp.MustCompile创建一个正则表达式模式,匹配有效的电子邮件地址格式。使用MatchString函数检查字符串是否与模式匹配。该模式涵盖了大多数有效的电子邮件地址格式,包括:局部用户名可以包含字母、数字和特殊字符:!.#$%&'*+/=?^_{|}~-`域名至少包含一个字母,后面可以跟字母、数字或连字符顶级域名(TLD)不能超过63个字符长

如何在 Go 中使用正则表达式匹配时间戳? 如何在 Go 中使用正则表达式匹配时间戳? Jun 02, 2024 am 09:00 AM

在Go中,可以使用正则表达式匹配时间戳:编译正则表达式字符串,例如用于匹配ISO8601时间戳的表达式:^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[+-][0-9]{2}:[0-9]{2})$。使用regexp.MatchString函数检查字符串是否与正则表达式匹配。

掌握Go语言的正则表达式和字符串处理 掌握Go语言的正则表达式和字符串处理 Nov 30, 2023 am 09:54 AM

Go语言作为一门现代化的编程语言,提供了强大的正则表达式和字符串处理功能,使得开发者能够更高效地处理字符串数据。掌握Go语言的正则表达式和字符串处理,对于开发者来说是非常重要的。本文将详细介绍Go语言中正则表达式的基本概念和用法,以及如何使用Go语言处理字符串。一、正则表达式正则表达式是一种用于描述字符串模式的工具,能够方便地实现字符串的匹配、查找和替换等操

PHP正则表达式:精确匹配与排除模糊包含 PHP正则表达式:精确匹配与排除模糊包含 Feb 28, 2024 pm 01:03 PM

PHP正则表达式:精确匹配与排除模糊包含正则表达式是一种强大的文本匹配工具,能够帮助程序员在处理文本时进行高效的搜索、替换和筛选。在PHP中,正则表达式也被广泛应用于字符串处理和数据匹配中。本文将重点介绍在PHP中如何进行精确匹配和排除模糊包含的操作,同时结合具体的代码示例进行说明。精确匹配精确匹配意味着只匹配符合完全条件的字符串,不匹配任何变种或包含额外字

如何在 Go 中使用正则表达式验证密码? 如何在 Go 中使用正则表达式验证密码? Jun 02, 2024 pm 07:31 PM

Go中使用正则表达式验证密码的方法如下:定义正则表达式模式,符合最低密码要求:至少8个字符,包含小写字母、大写字母、数字和特殊字符。使用regexp包中的MustCompile函数编译正则表达式模式。使用MatchString方法测试输入字符串是否与正则表达式模式匹配。

正则表达式通配符有哪些 正则表达式通配符有哪些 Nov 17, 2023 pm 01:40 PM

正则表达式通配符有"."、"*"、"+"、"?"、"^"、"$"、"[]"、"[^]"、"[a-z]"、"[A-Z]"、"[0-9]"、"\d"、"\D"、"\w"、"\W"、"\s&quo

中文字符过滤:PHP正则表达式实践 中文字符过滤:PHP正则表达式实践 Mar 24, 2024 pm 04:48 PM

PHP是一种广泛应用的编程语言,特别在Web开发领域中非常流行。在Web开发过程中,经常会遇到需要对用户输入的文本进行过滤、验证等操作,其中字符过滤是一项十分重要的操作。本文将介绍如何使用PHP中的正则表达式来实现中文字符过滤的功能,并给出具体的代码示例。首先,我们需要明确一下中文字符的Unicode范围是从u4e00到u9fa5,即所有的汉字都处于这个范围

See all articles