0

0

详解正则表达式

步履不停

步履不停

发布时间:2019-07-01 16:25:52

|

5732人浏览过

|

来源于php中文网

原创

详解正则表达式

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

相关推荐: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) 当前位置左边不是数字。

高级4 - 贪婪与懒惰

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

总结:

多种js正则表达式表单验证
多种js正则表达式表单验证

多种js正则表达式表单验证

下载

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

高级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文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2549

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1615

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1504

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1417

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1446

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

2

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
AngularJS教程
AngularJS教程

共24课时 | 2.6万人学习

【李炎恢】ThinkPHP8.x 后端框架课程
【李炎恢】ThinkPHP8.x 后端框架课程

共50课时 | 4.4万人学习

Swoft2.x速学之http api篇课程
Swoft2.x速学之http api篇课程

共16课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号