美文网首页正则表达式
正则表达式(php)

正则表达式(php)

作者: 全栈coder | 来源:发表于2017-02-24 23:54 被阅读31次

    正则表达式描述了一种字符串欧匹配模式,通过这个模式在特定的函数中对字符串进行匹配,查找,替换,分割等操作。

    四部分组成
    • 原子
    • 元字符
    • 定界符
    • 模式修正符
    定界符:

    正则表达式通常都需要将模式表达式放入定界符之间。作为定界的字符,可以是除了字母,数字,反斜线“\” 以外的任何字符,通常使用“/”作为定界符,不过建议使用“#”。(不要问我什么。。。)

    原子:

    正则表达式最基本的组成单位,一个正则表达式中最少要有一个原子。可以将其详细划分为5类。

    1.普通字符作为原子

    大小写字母或者数字,如 0-9、az、AZ

    2.一些特殊字符和元字符

    任何一个符号都可以作为原子使用,比如!,@,等等。。但是如这个符号在正则表达式中有特殊意义我们应该使用“\”进行转义,像引号,加号,星号等。应该转义为 " , ' , * , +

    3.非打印字符

    所谓非打印字符,是一些在字符串中的格式控制符号,例如空格,回车,制表符等

    4.使用“通用字符类型”作为原子

    有时我们需要一个原子匹配一类字符
    \d 等价于[0-9]
    \D 和楼上相反
    \s 匹配任意一个空白字符,等价于[\f\n\r\t\v]
    \S 和楼上相反
    \w 匹配任意一个数字,字母,下划线,等价于[0-9a-zA-Z_]
    \W 和楼上相反
    . 匹配除了任意一个字符,默认情况下不包括换行符相当于[^\n]

    5.自定义原子表([])作为原子

    使用原子表“[]”可以定义一组地位平等的原子,
    且只能从中选择一个原子进行匹配
    例如:

    /[ajd]sp/      --可以匹配asp,jsp,dsp三个里面的任意一个.
    /[^ajd]sp/    --可以匹配除了 asp,jsp,dsp三种以外的任何字符串,如xsp,nsp
    
    元字符:

    元字符不能单独出现,它必须用来修饰原子。
    有以下几种类型的元字符:

    1.限定符

    限定原子出现多少次才能满足匹配。有六种限定符
    “*”、表示任意次数
    “+”、表示一次或多次
    “?”、表示0次或者1次
    “{n}”、自定义n次
    “{n,}”、自定义n次以上
    “{n,m}”、自定义n次到m次

    2.边界限制

    限制字符串或者单词的边界范围获得更准确的匹配结果
    “^” 指字符串的开始
    “$”指字符串的结束
    “\b”描述字符串中的每个单词的前或后边界
    “\B”表示非单词边界

    3.模式选择符(|)

    “|”用来分割多选一的情况,优先级最低

    4.模式单元

    模式单元是使用元字符“()”将多个原子组合成一个大原子,当成一个单元独立使用

    5.后向引用

    使用元字符“()”标记的开始和结束多个原子,不仅是一个独立的单元,也是一个子表达式。这样,对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配储存到一个临时缓冲区,可以被获取以后使用。所捕获的每个子匹配都按照正则表达式模式中从左至右所遇到的内容储存。储存子匹配的缓冲区编号从1开始至99。每个缓冲区可以使用'\1'、‘\2’、‘\3’这样的形式进行引用,当然了,需要在前面加上一个反斜线转义,变成这样‘\1’、‘\2’、‘\3’。
    举个栗子:

    '/^\d{4}\W\d{2}\W\d{2}/'      --这是一个匹配日期的格式,如2008-08/08 或2008/08-08
    '/^\d{4}(\W)\d{2}\\1\d{2}/'   --这是一个匹配日期的格式,如2008-08-08 或2008-08-08
    

    在第一个例子中我们可以发现两个“\W”可以匹配任意特殊字符,两者完全可以不是同一个特殊字符,
    但在实际中我们要求日期间的特殊字符应该一致,比如都是“-”或者都是“/”。
    而第二个例子达到了这种效果,这是因为模式“\W”加上了元字符“()”,结果已经被储存在了缓冲区,所以在第一个“\W”的位置使用“-”,则下一个位置使用“\1”引用时,匹配模式也必须是字符串“-”。
    当需要使用模式单元而又不想储存匹配结果时,可以使用非捕获元字符“?:”、“?=” 或 “?!”忽略对相关匹配的保存。在一些正则表达式中,使用非储存模式单元是必要的,可以改变后向引用的顺序。如下所示:

    '/(windows)(linux)\\2OS/'    --使用“\2”再次引用第二个缓冲区中的字符串“linux”
    '/(?:windows)(linux)\\1OS/'  --使用“?:” 忽略了第一个子表达式的储存,所以“\1”所引用的就是“linux”   
    

    》模式匹配的优先级

    使用正则表达式时,需要注意匹配的顺序,通常是优先级从左到右进行运算,不同的优先级的运算先高后低。

    如下表:

    顺序 元字符 描述
    1 \ 转义符号
    2 ()、(?:)、(?=)、[] 模式单元和原子表
    3 *、+、?、{n}、{n,}、{n,m} 重复匹配
    4 ^、$、\b、\B、\A 、\Z 边界限制
    5 I 模式选择
    模式修正符:

    模式修正符在正则表达式定界符之外使用(最后一个斜线 ""之后)模式修正符可以调整正则表达式的解释,扩展了正则表达式在匹配、替换等操作时的某些功能,而且修正符可以组合使用,下列表格中,列出了一些常用的模式修正符及其功能。

    模式修正符 功能描述
    i 匹配时不区分大小写
    m 将字符串视为多行
    s 设定了此修正符 '.'将匹配所有的字符,包括换行符
    x 模式中的空白忽略不计,除非它已被转义
    e 只用在preg_replace()函数中,在替换字符串中对逆向引用做正常替换,将其作为php代码求职,并用其结果换来替换所搜索的字符串
    U 本修正符反转了匹配数量的值,使其不是默认的重复,而变成在后面跟上“?” 才变得重复
    D 模式中的美元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。如果设定了m修正符忽略此选项

    相关文章

      网友评论

        本文标题:正则表达式(php)

        本文链接:https://www.haomeiwen.com/subject/loiwwttx.html