zoukankan      html  css  js  c++  java
  • 正则表达式学习笔记

    /*新手的个人见解,勿以标准作量,-珍惜少年时*/

    每天都在学习每天都在更新...

    米哥跟我说:“正则表达式说白了就是字符匹配” 以下是我学习当中的笔记。

    正则表达式(Regular Expression)是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。

    在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。这就是正则的功能!

    正则表达式由:定界符、原子、元字符、模式修改符组成。

    /d{4}/:这就是一个简单而又完整的正则

    定界符:一般用"//",也可以用别的比如"{}"、"||"

    原子:最小的匹配单位,就是我们要找的字符里最小的单位。写在定界符当中。

    元字符:修饰原子,拓展原子功能和限定功能。比如“/7{5}/”中{5}就是用来修饰原子7的,{5}就是一个元字符。元字符要写在定界符里面。/7{5}/:的意思是说原子7的旁边必须要有5。

    模式修订符号:修饰正则表达式,对模式(正则)修正,卸载定界符的外面。

    原子

    • 打印字符:也就是我们能够打印出来的字符,能够看得到的。比如0-9,a-z,A-Z,!@.....等等。能够看得到的。注:除了a-z,A-Z,0-9以外的符号尽量加转义符号处理。转义字符能够将有意义的转化为没有意义的,没有意义的转化为有意义的。
    • 非打印字符:比如“回车”,,“tab键”.....等等。

    正则表达式函数:preg_match (pattern , subject, matches)

    参数描述
    pattern 正则表达式
    subject 需要匹配检索的对象
    matches 可选,存储匹配结果的数组

    与之雷同的函数还有一个preg_match_all,该函数多用的功能就是可以打印所有匹配的,并打印为数组。 

    动手写第一个正则:

    <?php 
    $str="i love pc";
    $reg="/pc/";
    if(preg_match($reg,$str,$arr)){
        echo "正则表达式:<b>{$str}</b>和<b>{$reg}</b>匹配成功</b><br>";
        print_r($arr);
    }else{
        echo "正则表达式:<b>{$str}</b>没有和<b>{$reg}</b>匹配成功";
        print_r($arr);
    }
     ?>
    输出:
    正则表达式:i love pc/pc/匹配成功
    Array ( [0] => pc )

    元字符

    • ^ 和 A 表示必须以什么开头,这个必须要写在正则的前面。
    • $ 和  表示必须以什么结束,这个必须要放在表达式的最后面。

    常用的元字符

    :单词边界,原子的左侧,即为成功,右侧无love单词即为失败。若love即是两侧。需要 两侧都要有love这个单词才匹配成功。B与之相反。

    <?php 
    $str="ilove love pc";
    $reg="/love/";
    if(preg_match($reg,$str)){
        echo "匹配成功";
    }else{
        echo "匹配失败";
    }
     ?>
    输出:
    匹配成功

    /^abc.*abc$/

    表示必须以 abc为开始abc结束中间随意。因为点的意思就是任意的原子,而*则表示任意的次数。

    一个简单的匹配日期表达式:

    /d{4}-d{2}-d{2}/

    d表示匹配的只能是数字,{4}表示匹配的数是四位的,-为连接符。#注:如果想要不限制长度,假设年不是四位数的,是1到5位数的,那么即{1,5}跟数学当中的集合类似。故有正无穷之说。但无负无穷,原因摸摸脚丫子都知道。

    字符描述
    将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“ ”匹配一个换行符。串行“\”匹配“”而“(”则匹配“(”。
    ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“ ”或“ ”之后的位置。
    $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“ ”或“ ”之前的位置。
    * 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
    + 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
    ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
    {n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
    {n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
    {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
    ?

    当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。

    更多正则表达式全集传送门:http://tool.oschina.net/uploads/apidocs/jquery/regexp.html

     

     模式修订符号

    模式修正符 说明
    i 表示在和模式进行匹配进不区分大小写
    m 将模式视为多行,使用^和$表示任何一行都可以以正则表达式开始或结束
    s 如果没有使用这个模式修正符号,元字符中的"."默认不能表示换行符号,将字符串视为单行
    x 表示模式中的空白忽略不计
    e 正则表达式必须使用在preg_replace替换字符串的函数中时才可以使用(讲这个函数时再说)
    A 以模式字符串开头,相当于元字符^
    Z 以模式字符串结尾,相当于元字符$
    U 正则表达式的特点:就是比较“贪婪”,使用该模式修正符可以取消贪婪模式

    使用字符i演示如下:

    <?php 
    $str="this is TEST";
    $reg="/test/i";
    if(preg_match($reg,$str)){
        echo "匹配成功";
    }else{
        echo "匹配失败";
    }
     ?>
    输出:
    匹配成功

    使用字符M演示如下:

    <?php 
    /*****************************Test**1*****************************/
    $str1="hello world abcxishaonian nihao i love chinakungfu"; $reg1="/^abc/"; if(preg_match($reg1,$str1,$arr)){ echo "{$reg1}匹配{$str1}成功<br>"; }else{ echo "{$reg1}匹配{$str1}失败<br>"; }
    /***************************Test**2**********************************/
    $str2="hello world abcxishaonian nihao i love chinakungfu"; $reg2="/^abc/m"; if(preg_match($reg2,$str2,$arr)){ echo "{$reg2}匹配{$str2}成功<br>"; }else{ echo "{$reg2}匹配{$str2}成功"; } ?>
    输出:
    /^abc/匹配hello world abcxishaonian nihao i love chinakungfu失败
    /^abc/m匹配hello world abcxishaonian nihao i love chinakungfu成功

     使用字符S演示如下:

    <?php 
    $str="china HelloWorld kungfu.nihao,halou.meximexi";
    $reg="/hello world/i";
    if(preg_match($reg,$str)){
        echo "案例一匹配成功<br>";
    }else{
        echo "案例一匹配失败<br>";
    }
    $str2="china HelloWorld kungfu.nihao,halou.meximexi";
    $reg2="/hello world/ix";
    if(preg_match($reg2,$str2)){
        echo "案例二匹配成功<br>";
    }else{
        echo "案例二匹配失败";
    }
    
     ?>
    输出:
    案例一匹配失败
    案例二匹配成功

     使用字符U演示如下:

    <?php 
    $str="<b>你好,世界</b>,劝君珍惜少年时。<b>hello world</b>";
    $reg="/<b>.*</b>/U";
    if(preg_match_all($reg,$str,$arr)){
        echo "{$reg}匹配成功{$str}<br>";
    }else{
        echo "{$reg}匹配失败{$str}<br>";
    }
    $str2="<B>你好,世界</b>,劝君珍惜少年时。<b>hello world</B>";
    $reg2="/<b>.*?</b>/i";
    if(preg_match_all($reg2,$str2,$arr)){
        echo "{$reg2}匹配成功{$str2}<br>";    
    }else{
        echo "{$reg2}匹配失败{$str2}<br>";
    }
    ?>
    输出:
    /<b>.*</b>/U匹配成功你好,世界,劝君珍惜少年时。hello world
    /<b>.*?</b>/i匹配成功你好,世界,劝君珍惜少年时。hello world

    从中看得出来,字符U的效果跟.*?的作用是一样的。建议使用.*?因为U在部分的脚本里面不兼容

     

    /*

    关于正则的一些资料:

    正则表达式的优先级:http://www.cnblogs.com/xishaonian/p/6089644.html

    正则表达式的案例URL的匹配:http://www.cnblogs.com/xishaonian/p/6089638.html

    待更新.....

    */

  • 相关阅读:
    第三章 属性高级
    第二章 对象高级
    第一章 函数高级
    JavaScript笔记(6)
    Charles断点设置
    Charles安装及设置
    python-uiautomator2(001)
    Pycharm安装及激活
    Postman中Collection Runner添加外部数据文件
    Postman带Token的接口测试
  • 原文地址:https://www.cnblogs.com/xishaonian/p/6067488.html
Copyright © 2011-2022 走看看