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

相关推荐:
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视频教程

更多相关文章

  1. php实现特殊字符的替换操作
  2. 使用PHP生成带有干扰线的验证码,干扰点、字符倾斜详细类代码
  3. php 字符串替换方法
  4. php反转字符串方法
  5. php无乱码切割中文字符
  6. PHP中常用的18个字符串函数
  7. 大括号在php中的一些作用
  8. php检测字符串是否包含字符串
  9. php截取字符串不乱码

随机推荐

  1. Android手机游戏开发入门教程
  2. android创建类似QQ的android弹出菜单
  3. Android 支持多屏幕机制
  4. android 开发中java.net.UnknownServiceE
  5. Android 实现聊天-smack4.19
  6. android简单计算器源码
  7. android - Animation prevents click eve
  8. about android screen
  9. android ndk 开发
  10. Android消息推送MQTT