zoukankan      html  css  js  c++  java
  • 如何正确理解正则表达式中的分隔符 

    前言:好久不见,博客园。

    最近在学习研究regex,其中有个特迷惑自己的知识点是分隔符 ( word boundary) [] (注:为了方便,后文都以[]来包含字符,并不是reg规则里面的[] ),后面查询咨询了解,明白了,记录下来,希望帮到恰好迷惑的你。

    [] 官方解释是:Match a word boundary,匹配一个单词边界,也就是单词和空格之间的位置,它本身不匹配任何字符。一般它有三种情况,如下:

    1. 在一个 w 字符之前,eg:  end
    2. 在一个 w 字符之后,eg: end
    3. 在两个字符之间 ;

    情况1,2都比较容易理解,这里就略过,主要从第3种情况来讲讲理解。

    最开始从网上看到这样一句话:“如果需要更精确的说法,[] 匹配这样的位置:它的前一个字符和后一个字符不全是(一个是,一个不是或不存在) [w] (匹配字母或数字或下划线或汉字)”;

    那做个试验:

        var reg = /endand/g;
        var string = 'wenkend,end,and,endend';
        alert( reg.test(string) ) ; //false

    根据上述理解 [] 要求它分隔的是一边是 [w] , 一边是非 [w]。我最开始理所当然的理解为正则表达式 [ endand ] 匹配字符串 [end,and]  end的右边是分隔符 [,]  ,符合匹配,and的左边是分隔符 [,] , 符合匹配。那么它就应该符合匹配,可是为什么结果是 false 呢?

    后面发现自己大错特错。

    正确理解如下分三步来理解:

    -----------------
    /endand/g,   "end,and"        (匹配end,true)
       |              |
    -----------------
    
    /endand/g,   "end,and"        (匹配end后面是否有分隔符,有[,] - true)
         |             |
    ------------------
    
    /endand/g,   "end,and"        (now,接下来匹配的是否是字符and,因为 []只是匹配匹配一个位置,本身并不匹配任何字符,所以
                                     等待匹配的字符串应该是 [,and] ,而不是[and],显而易见,[,and] 并不符合匹配规则 [and] - false

    总结来说就是:[endand] 或者其他类似这样的正则表达式是没有意义的,可以说永远也不会存在的。

    如果 [] 在中间,regex表达式写法必须遵循在 [] 的左右两侧一个是[w],一个是非 [w],例如 [end\,] . 

    如有错误或疑问或建议,请指正,谢谢~

  • 相关阅读:
    使用SQLCOMMAND以及SQLADAPERT 调用存储过程
    将表A的数据复制到表B,以及关于主表和子表的删除办法
    登录次数验证,可能还是有些不足的,希望大家指正
    MVC过滤器
    sql数据库delete删除后怎么恢复,这是网上找的答案。。希望大神验证指教一下
    淘宝前后端分离实践
    P1852 [国家集训队]跳跳棋
    P2154 [SDOI2009]虔诚的墓主人
    P4208 [JSOI2008]最小生成树计数
    P2467 [SDOI2010]地精部落
  • 原文地址:https://www.cnblogs.com/zaoansijia/p/6019619.html
Copyright © 2011-2022 走看看