• 技术文章 >后端开发 >php教程

    详解正则表达式

    步履不停步履不停2019-11-01 09:36:45原创2918

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

    相关推荐:
    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 - 分组与后向引用

    分组

    反向引用

    示例:

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

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

    高级4 - 贪婪与懒惰

    总结:

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

    高级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中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:正则表达式
    上一篇:PHP性能分析平台搭建 下一篇:不要在循环体中使用array_push()
    大前端线上培训班

    相关文章推荐

    • 什么是PHP正则表达式?PHP正则表达式的使用方法(附代码)• php正则表达常用函数的总结(代码示例)• PHP面试中正则表达式的知识总结(超详细)

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网