zoukankan      html  css  js  c++  java
  • [正则表达式]难点和误区

    1.语言的转义

    正则表达式一般通过语言的字符串字面量传达给正则表达式引擎,所以在到达真正的表达式引擎时,表达式还会通过一层语言本身的字符串字面量转义。

    比如PHP中,需要匹配反斜杠则需要在字面量中输入4个反斜杠,其中两个反斜杠实际的转义意义发生在PHP本身对字符串字面量处理的层面上,最终到表达式引擎收到的表达式是[\]。

    $match = array();
    preg_match('/[\\]/', 'aaaaaa', $match);
    var_dump($match);

     2.十六进制代码点的转义

    以ASCII为例,通常字符组都会支持如[x00-xff]这样的十六进制代码点转义,意思是匹配编码为00到ff的ASCII字符。

    Unicode特殊一些,由于Unicode的编码范围超过FF,这个时候就需要用到多字节代码点,不过不同语言的支持程度有点不一样,详情需要参考《精通正则表达式(第三版)》118页。

    就PHP而言,preg包支持xF,xFF,x{F...}的单字,双字,多字的转义方法,如果需要支持Unicode,则需要在u模式下,比如:

    $match = array();
    preg_match_all('/[xaxd]/u', "
    ", $match);
    var_dump($match);
    
    $match = array();
    preg_match_all('/[x{2460}x{2462}]/u', '①②③', $match);
    var_dump($match);

    $match = array();
    preg_match_all('/[x{1f34b}-x{1f34c}]/u', "zßu6c34xf0x9fx8dx8c", $match);
    var_dump($match);

    而对于Javascript,则支持xFF,uFFFF的双字,四字的转义方法,而且uFFFF表明正则运行在Unicode模式,不需要额外指明u模式,比如:

    var patt=new RegExp("[x0ax0d]","g");
    var str="
    ";
    while ((result = patt.exec(str)) != null)  {
        console.log(result);
    }
    
    var patt=new RegExp("[u2460-u2463]","g");
    var str="①②③";
    while ((result = patt.exec(str)) != null)  {
        console.log(result);
    }
    ①②③
  • 相关阅读:
    E
    D
    Npp ChangeLog
    c++ 书籍(zz)
    再好的工作是为了更好的生活
    如何将JPG格式的图片转换成PNG格式
    点分治
    团体程序设计天梯赛(CCCC) L3021 神坛 的一些错误做法(目前网上的方法没一个是对的) 和 一些想法
    团体程序设计天梯赛(CCCC) L3019 代码排版 方法与编译原理密切相关,只有一个测试点段错误
    团体程序设计天梯赛(CCCC) L3015 球队“食物链” 状态压缩
  • 原文地址:https://www.cnblogs.com/yiyide266/p/10469518.html
Copyright © 2011-2022 走看看