zoukankan      html  css  js  c++  java
  • 正则

    认识正则

    正则其实就是字符串规则表达式

    入手:找谁?怎么找?找几个?
     
    具体字符 (字面值)
    字符边界
    字符集合[ace],[01235689]
    字符补集[^ qxz ]:不在qxz 范围内
    字符范围[a-z0-9]
    字符簇(系统定义好的常用集合)
     
    字符边界
    - ^ 匹配字符串的开始
    - $ 匹配字符串的结尾
    -  匹配单词的开始和结尾(边界)
    - B匹配单词的非边界
     

    常用字符簇

    代表
    .(点)
    任意字符,不含换行
    w
    [a-z A-Z 0-9_ ]
    W
    w 的补集
    s
    空白符,包括 v 等
    S
    非空白符
    d
    [0-9]
    D
    非数字

    “”匹配单词边界,不匹配任何字符。 
    “”匹配的只是一个位置,这个位置的一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。“”是零宽度的。 
    基本上所有的资料里都会说“”是单词边界,但是关于“单词”的范围却是少有提及。通常情况下,正则表达式中所谓的“单词”,就是由“w”所定义的字符所组成的子串。 
    “”表示所在位置的一侧为单词字符,另一侧为非单词字符、字符串的开始或结束位置

    匹配不全是w的单词边界。意思就是一定是一侧是构成单词的字符,另一侧为非单词字符、字符串的开始或结束位置。

    零宽与非零宽

    非零宽字符:能够匹配字符的(特殊)字符。如:d会匹配一个数字,s会匹配空白字符 
    零宽字符:不匹配字符,只标记位置如 ^ $  B

    * 匹配前面的子表达式零次或多次。
    + 匹配前面的子表达式一次或多次。
    ? 匹配前面的子表达式零次或一次。
    {n} n 是一个非负整数。匹配确定的 n 次。
    {n,m} m 和 n 均为非负整数,其中n <= m
    最少匹配 n 次且最多匹配 m 次。。
    {n,} n 是一个非负整数。至少匹配n 次。
     
    eg:
    // 5个字母组成的单词
    $patt = '/[a-zA-Z]{5}/';
    // 3-5个字母组成的单词
    $patt = '/[a-zA-Z]{3,5}/';
    // 5个以上字母组成的单词
    $patt = '/[a-zA-Z]{5,}/';
    

      

    或者的用法
     
    //查询纯数字或纯字母的单词
    $patt = '/[a-zA-Z]+|[0-9]+/';
    

      

    贪婪与非贪婪

     贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。 从正则语法的角度来讲,被匹配优先量词修饰的子表达式使用的就是贪婪模式,如“(Expression)+”;被忽略优先量词修饰的子表达式使用的就是非贪婪模式,如“(Expression)+?”。 

    分组和向后引用

    圆括号匹配(捕获分组)

    (1).圆括号内包含的表达式语义与没有加圆括号时一致,区别在于圆括号内的内容将会加入到捕获分组,捕获分组的概念

    (2).圆括号也可以和限定符搭配使用,限定圆括号内的匹配语义出现次数

    捕获分组的概念

    先看下面两个例子:

    假如有字符串 3cd

    则 “(d)cd ”匹配结果为 3cd 和 3

    假如有字符串 6cd

    则 (3|6)cd 匹配结果为 6cd 和 6

    括号里面的匹配则为捕获匹配,且括号里面的匹配结果将会被缓存 ,第一个例子括号里的括号匹配的结果为3,第二个括号里匹配结果为6

    如果想消除缓存,可以在括号最前面加上 ?:

    1中 (?:d)cd 匹配结果为 3cd ,等价于 [d]cd 或 dcd

    2中 (?:3|6)cd 匹配结果为 6cd,等价于 [36]cd

    后向引用:

    捕获分组可以进行 后向引用 (如果正则表达式后面有相同的捕获分组内容,可以根据顺序直接引用前面定义的捕获组,简化表达式)

    (d)cd1 这里的"1"就是对"(d)"的后向引用 ,等同于(d)cd(d)

    (a)(b)(ac).* 123

    等价于

    (a)(b)(ac).* (a)(b)(ac)

    模式

    模式修饰符,可以一定程度上影响正则的解析行为
    比如i, 就代表正则不区分大小写, /[a-z A-Z ]+/ --->/[a-z ]+/i
    比如s, 单行模式, 就代表把整个文件看成一个"单行"

    u模式,把传入的参数看成是Unicode字符集的编码,可以判断中文

    php下正则匹配中文

    $patt = '/^[x{4e00}-x{9fa5}]+$/u';
    

     

    预查

     

  • 相关阅读:
    error和exception有什么区别?
    运行时异常与一般异常有何异同?
    由c++循环中局部变量地址不变而引发的思考
    Navicat连接Mysql数据库报错,但是命令行可以连接上
    git reset --hard HEAD^后显示more?的解决方案
    java基础易错、难理解、易混淆知识点复习
    More than one file was found with OS independent path 'assets/ap1.data'
    UML类图中方法(操作)的表示格式
    正则匹配以xx开头以xx结尾的单词
    运行PL/SQL时只输出anonymous block completed
  • 原文地址:https://www.cnblogs.com/DSKer/p/12267391.html
Copyright © 2011-2022 走看看