• JavaScript正则表达式快速判断技巧


      这里是JS的正则的一点心得,并不是最完整的规则汇总,更侧重实际运用中的快速判断,初学者接触正则之后往往会被一堆星号括号给弄晕,有了一些速判技巧就能从整体上把握从而不慌乱。

      JS正则快速判断技巧的核心就是:注意圆括号问号。这已经能够应付大部分实际应用了。

    一、圆括号

      众所周知,正则中中括号表示范围,大括号表示重复次数,圆括号表示分组。

      圆括号表示分组,但是分组内还有很多文章,细分一下:

           (1):圆括号本身表示分组,同时会保存匹配的项,这叫捕获性分组,默认都是这样的,比如:
             var c="a001”;  /a(d*)/.test(c);  console.log(RegExp.$1);    //001
             var num=“1234 5678”;  var newNum=num.replace(/(d{4}) (d{4})/,”$2 $1");
           (2):如果不想保存,就采用非捕获性分组(?:),比如:
             var c="a001”;  /a(?:d*)/.test(c);  console.log(RegExp.$1);     //空
           (3):圆括号的分组里,可以对字符组合使用限定符,并且其后可以跟次数,比如:(Ad){2}匹配A3A5
           (4):从分组里多个直接量中选择一个。比如:g(A|a)y,不过这种情况用 g[Aa]y 更快
           (5):当模式中有嵌套圆括号时,变量的编号会按照圆括号开始出现的位置一次进行,比如:
                /([A-Za-z](d{2}))((-)d{2})/匹配”A22-33”时,匹配情况如下:
                $1: A22, $2: 22, $3: -33, $4: -
           (6): (?:)表示非捕获性分组,(?=)则表示正向前瞻分组,a(?=reg)匹配后边跟着reg的a;
           (7): (?!)则表示负向前瞻分组,a(?!reg)匹配后边不跟着reg的a;
           (8): (?<=)和(?<!)表示正向和负向后瞻,JavaScript不支持后瞻
     
      前面提到的捕获性分组,这衍生出一个反向引用,是指在正则表达式中,就使用前面捕获性分组保存的内容,用””加上序号来引用,比如 /(dog)1/就可以匹配”dogdog”。
     
    二、问号
      问号的用法需要记住三种,除了上面已经提到了在圆括号内部的用法。另外记住下边两种用法即可:
      1、如果问号是直接跟在其他字符后面,则作为一个简单量词,表示出现零次或一次,简单量词还包括:*,+,{n},{n,m},{n,}。
      2、当问号本身是紧跟在其他简单量词之后的时候,它不再作为简单量词,而是改变了量词属性,从贪婪量词变为惰性量词。贪婪量词的意思是在匹配的时候先一口气匹配整个字符串,发现匹配不了的时候,去掉最后一个字符,再匹配,直到长度为零。惰性量词则相反,一次匹配前面一个字符,发现不匹配就再匹配一个。(还有一种支配量词,是在简单量词之后连上加号,前面两种量词都会反复尝试,而支配量词只尝试一次,失败就算了。JavaScript不支持支配量词。)。
    所有简单量词本身都是贪婪量词。比如:
     
     
    数组的第一项表示字符串中与整个模式匹配的字符串,之后的每一项(如果有)保存着与正则表达式中的捕获组匹配的字符串。
     
      看,其实东西也不多,只要记住了圆括号和问号的用法,就可以快速将正则式加以分割然后逐个理解,从而不会被一堆问号星号括号给弄晕了。当然最基础的一些知识还是要具备的,不过是纯记忆性质的,比较简单了,附上一些常用知识:
    字符正则描述
    / / 制表符
    / / 制表符
    / / 回车符
    f /f/ 换页符
    a /a/ alert字符
    e /e/ escape字符
    cX /cX/ 与X相对应的控制字符
     // 与回退字符
    v /v/ 垂直制表符
    // 空字符
     
    字符等同于描述
    . [^ ] 除了换行和回车之外的任意字符
    d [0-9] 数字字符
    D [^0-9] 非数字字符
    s [ x0Bf ] 空白字符
    S [^ x0Bf ] 非空白字符
    w [a-zA-Z_0-9] 单词字符(所有的字母)
    W [^a-zA-Z_0-9] 非单词字符 
     
     
  • 相关阅读:
    java集合源码
    数据库表链接的几种方式
    面试题(RabbitMQ)
    常见面试题(Redis)
    某奥笔试题
    Servlet
    1——Django的基础及环境搭建
    6.13---example
    6.12---知道参数的重要性------插入数据-删除数据-修改数据注意Map
    6.12---前提两个对象的成员必须一致,才能将有数据的对象将数据传给反射获取的对象conver(有数据对象,目标对象)
  • 原文地址:https://www.cnblogs.com/dson/p/4403052.html
Copyright © 2020-2023  润新知