正则表达式语言由两种基本字符类型组成:原义(正常)文本字符和元字符。
相关推荐:
1. 正则表达式语法教程(含在线测试工具)
2. PHP正则表达式极速入门视频教程
元字符使用正则表达式具有处理能力。元字符既可以是放在[ ]
中的任意单个字符(如 [a]
表示匹配单个小写字符 a
),也可以是字符序列(如 [a-d]
表示匹配 a 、b、 c、 d
之间的任意一个字符,而 \w
表示任意英文字母和数字及下划线),常见的元字符如下:
常见的元字符
字符 | 描述 | 特别说明 |
---|---|---|
. |
匹配除换行符(\n )以外的任意字符 |
~ |
[abcde] |
匹配 a b c d e 之中的任意一个字符 |
所有字符是 或 的关系 |
[a-h] |
匹配 a 到h 之间的任意一个字符 |
~ |
[^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 |
匹配单词的开始或结束 | ~ |
^ |
匹配字符串的开始 | 放在中括号的第一个字符前 则变为 取反的意思 |
$ |
匹配字符串的结束 | ~ |
正则表达式限定符
作用:限定这个符号前面 一个 单元 多出现的次数
单元:
- 如果前面出现的是一个字符的话,则这一个字符就为一个 单元
- 如果前面我们用小括号把一个很长的字符串括起来的话,那么整个小括号里面都算是一个 单元
上面的元字符都是针对单个字符匹配的,要想同时匹配多个字符的话,还需要借助限定符,下面是一些常见的限定符(下表中 n
和 m 都是表示 整数。)
字符 | 描述 | 特别说明 |
---|---|---|
* |
匹配 0 到 多 个元字符,相当于 {0,}
|
~ |
? |
匹配 0 到 1 个元字符, 相当于 {0,1}
|
~ |
+ |
匹配至少 1 个元字符,相当于 {1,}
|
~ |
{n} |
匹配 n 个元字符 | ~ |
{n,} |
匹配至少 n 个元字符 | ~ |
{n,m} |
匹配 n 到 m 个元字符 | ~ |
\b |
匹配单词边界 | ~ |
^ |
字符串必须以指定的字符开始 | ~ |
$ |
字符串必须以指定的字符结束 | ~ |
说明 - 特例
- 可以将多个元字符或者原义文本字符用括号括起来形成一个
分组
,比如^(13)[4-9]\d{8}$
表示任意以 13 开头的移动手机号码。-
abcabcabc+
表示 最后的字母c
出现 1 次或 多次; -
(abcabcabc)+
表示 整个字符串abcabcabc
出现 1 次或 多次。
-
- 可以使用
|
来表示或
的关系,例如z|j|q
表示匹配z 、j、q
之中的任意一个字母。其实等价于[zjq]
。-
ab|cd|ef
表示的是:要么是ab
、要么是cd
要么是ef
。 -
a(b|cd|e)f
表示的是:以a
开头,要么是b
、要么是cd
要么是e
,最后以f
结尾。 - 总结:
|
(或
) 的唯一边界是 小括号(( )
)
-
-
[0-9A-Z.?]
这个正则你如何理解?- 当
.
和?
出现在中括号中时,.
和?
将变为 普通字符,它就是 点 和 问号。你可以理解为[ ]
的优先级要大于. 和 ?
的优先级。 - 此正则表达式将会完全匹配字符串
?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
的话,它会匹配aab
和ab
。
总结:
贪婪与懒惰模式之间的区别就在于:懒惰模式 在量词
*
的后面多了一个 问号?
。
高级5 - 模式匹配的优先级
在使用正则表达式时,需要注意匹配的顺序。通常相同优先级 从左到右 进行计算,不同优先级的运算 先高后低。各种操作符的匹配顺序优先级 从高到低 如下表所示。
顺序 | 元字符 | 描述 |
---|---|---|
1 | \ |
转义字符 |
2 |
() 、(?:) 、(?=) 、[]
|
模式单元和原子表 |
3 |
* 、+ 、? 、{n} 、{n,} 、{n,m}
|
重复匹配 |
4 |
^ 、$ 、\b 、\B 、\A 、\Z
|
边界限制 |
5 | | |
模式选择 |
实例
1. 字符转义
1问:要匹配字符串 333333\$33\33333
中的 \$
正则应该怎么写?
2问:如果在 PHP 中 preg_match
函数分别用单引号和双引号的表达式来匹配上面的 \$
,怎么写?
答案:
- 表达式需要的规则是
\\\$
- 用单引号表示上面的字符串
'/\\\\\\$/'
。(为方便查看我们拆分一下为'/\\ \\ \\ $/'
) - 用双引号表示上面的字符串
"/\\\\\\\$/"
。(为方便查看我们拆分一下为"/\\ \\ \\ \$/"
) - 问什么呢?
再答:
- PHP 中单引号不转义任何字符,但是唯独转义
\
,所以我们需要 6个\
来生成表达式。 双引号除了转义
\
以外,还需要多一个\
用来转义$
所以它 需要 7 个\
。
相关教程推荐:PHP视频教程
以上是详解正则表达式的详细内容。更多信息请关注PHP中文网其他相关文章!

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

PHP不是在消亡,而是在不断适应和进化。1)PHP从1994年起经历多次版本迭代,适应新技术趋势。2)目前广泛应用于电子商务、内容管理系统等领域。3)PHP8引入JIT编译器等功能,提升性能和现代化。4)使用OPcache和遵循PSR-12标准可优化性能和代码质量。

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。

在PHP中,trait适用于需要方法复用但不适合使用继承的情况。1)trait允许在类中复用方法,避免多重继承复杂性。2)使用trait时需注意方法冲突,可通过insteadof和as关键字解决。3)应避免过度使用trait,保持其单一职责,以优化性能和提高代码可维护性。

依赖注入容器(DIC)是一种管理和提供对象依赖关系的工具,用于PHP项目中。DIC的主要好处包括:1.解耦,使组件独立,代码易维护和测试;2.灵活性,易替换或修改依赖关系;3.可测试性,方便注入mock对象进行单元测试。

SplFixedArray在PHP中是一种固定大小的数组,适用于需要高性能和低内存使用量的场景。1)它在创建时需指定大小,避免动态调整带来的开销。2)基于C语言数组,直接操作内存,访问速度快。3)适合大规模数据处理和内存敏感环境,但需谨慎使用,因其大小固定。

PHP通过$\_FILES变量处理文件上传,确保安全性的方法包括:1.检查上传错误,2.验证文件类型和大小,3.防止文件覆盖,4.移动文件到永久存储位置。

JavaScript中处理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。1.??返回第一个非null或非undefined的操作数。2.??=将变量赋值为右操作数的值,但前提是该变量为null或undefined。这些操作符简化了代码逻辑,提高了可读性和性能。


热AI工具

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

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

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

Atom编辑器mac版下载
最流行的的开源编辑器