好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

详解正则表达式

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

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

以上就是详解正则表达式的详细内容,更多请关注Gxlcms其它相关文章!

查看更多关于详解正则表达式的详细内容...

  阅读:50次