• js正则学习


    一直对正则很纠结也很畏惧,以前感觉花时间理解一个个奇奇怪怪的符号,还不如直接百度谷歌之。

    但知其然不知其所以然也是种痛苦,所以花了两天稍微学了一下,虽然没学很深入彻底,但也比之前进步不少,特此笔记。

    js正则

    g:表示全局,匹配全部
    i:表示不区分大小写
    m:表示匹配多行(匹配换行两端的潜在匹配)

    RegExp实例属性:
      global:是否设置了g
      ignoreCase:是否设置了i 
      lastIndex:表示下一次exec开始搜索下个匹配项的字符位置 
      multiline:表示是否设置了m 
      source:正则表达式的字符串表示

    RegExp实例方法: 
      exec(str);用于捕获组(用小括号指定一个子表达式),返回包含第一个匹配项信息的数组。 
      test(str);用于验证是否匹配,返回true或false。

    RegExp构造函数属性: 
      input[$_]:最近一次要匹配的字符串,opera未实现 
      lastMatch[$&]:最近一次匹配项,opear未实现 
      lastParen[$+]:最近一次匹配的捕获组,opera未实现 
      leftContext[$’]:input字符串中lastMatch之前的文本 
      multiline[$*]:表示是否所有表达式都是用多行模式,ie和Opera不支持 
      rightContext[$']:input字符串中lastMatch之后的文本

    :转义字符 
    ^ : 匹配字符串开头,如/^a/ 匹配 an A 而不匹配 An a 
    $ : 匹配字符串结尾,如/a$/ 匹配 An a 而不匹配 an A 
    * : 匹配匹配前面元字符0或多次 /ba*/将匹配b,ba,baa,baaa * = {0,}
    + : 匹配前面元字符1次或多次 /ba+/ 匹配ba + = {1,}
    ? : 匹配前面元字符0次或1次,/ba?/将匹配b,ba ? = {0,1}
    (x) 匹配x保存x在名为$1...$9的变量中 
    .匹配除行结束符意外的任何字符 
    x|y 匹配x或y 
    {n} 精确匹配n次 
    {n,} 匹配n次以上 
    {n,m} 匹配n-m次 
    [xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符) 
    [^xyz] 不匹配这个集合中的任何一个字符 
    [] 匹配一个退格符 
     匹配一个单词的边界 
    B 匹配一个单词的非边界 
    cX 这儿,X是一个控制符,/cM/匹配Ctrl-M 
    d 匹配一个字数字符,/d/ = /[0-9]/ 
    D 匹配一个非字数字符,/D/ = /[^0-9]/ 
    匹配一个换行符 
    匹配一个回车符 
    s 匹配一个空白字符,包括 , ,f, ,v等 
    S 匹配一个非空白字符,等于/[^ f v]/ 
    匹配一个制表符,tab建 
    v 匹配一个重直制表符 
    w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[w]匹配"$5.98"中的5,等于[a-zA-Z0-9] 
    W 匹配一个不可以组成单词的字符,如[W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。
    1 对第一个捕获组的文本进行引用,用于再次匹配 如:(...)...1 
    (?=) 向前正匹配 (?!)向前负匹配

    以上就是大部分常用的令人生畏的正则语法,用了之后其实常用的也是有规律可寻,难以概况但熟能生巧。

    下面就是从书中摘取的实例:

    //正则表达式:
    function testUrl(){
        var pt = /^(?:([A-Za-z]+):)?(/{0,3})([0-9.-A-Za-z]+)(?::(d+))?(?:/([^?#]*))?(?:?([^#]*))?(?:#(.*))?$/;
        
        //pt解析:
    //    ^ 匹配字符串开头
    //    (?:(A-Za-z+):)?        ?:表示非捕获组    (A-Za-z+):表示匹配字母后加:,且是第一个捕获组    ?表示分组可选
    //    (/{0,3})              ()表示第二个捕获组    /转义,匹配/        {0,3}匹配前面字符0-3次
    //    ([0-9.-A-Za-z]+)     ()第三个捕获组    []匹配方括号内的字符    0-9 . - A-Za-z 匹配这四种字符  +多个
    //    (?::(d+))?            ?:非捕获组  :匹配冒号开始  (d+)第四个捕获组,匹配多个数字  ?可选
    //    (?:/([^?#]*))?       /匹配/    ([^?#]*)第五个捕获组,匹配除?#外的字符  *该字符类将匹配n次
    //    (?:?([^#]*))?        ?匹配?  ([^#]*)第六个捕获组,匹配除#外的字符  *匹配多次
    //    (?:#(.*))?        #匹配#     (.*)第七个捕获组   .匹配除结束符外的所有字符  *匹配多次
    //    $  字符串结束
    
    
        var url = 'http://www.ora.com:80/goodparts/abcde?q#fragment';
        var res = pt.exec(url);
        var names = ['url','scheme','slash','host','port','path','query','hash'];
        var blanks = ' ';
        for(var i=0;i<names.length;i++){
            console.log(names[i]+':'+blanks.substring(names[i].length),res[i]);
        }
    }

     
    function testNumber(){
        var pt = /^-?d+(?:.d*)?(?:e[+-]?d+)?$/i;
    //pt解析
    //    ^  $ 分别匹配开头和结尾
    //    -?    -匹配0次或一次,也就是可选
    //    d+  匹配至少一个数字
    // (?:.d*)?   ?:非捕获组   .匹配小数点  d* 小数点后匹配任意个数字  ?可选
    //    (?:e[+-]?d+)?   ?:非捕获组  e匹配e和E  [+-] 匹配加号或者减号  ?可选  d+匹配一个以上数字   ?可选
    
        console.log(pt.test(-1));
        console.log(pt.test(100.1993));
        console.log(pt.test("sss"));
        console.log(pt.test(123.45E-67));
    }

    正则中用法比较重要的个人感觉就是捕获组,和非捕获组,捕获组在replace方法中也会很有用,比如创建模板模式,通过一些匹配替换内容。

  • 相关阅读:
    Linux ld命令
    Linux readelf命令
    linux ar命令
    Linux升级Ruby
    Linux dkpg命令
    Linux apt-get命令
    Linux xxd命令
    Linux objdump命令
    Linux ldconfig命令
    git 删除目录
  • 原文地址:https://www.cnblogs.com/laojun/p/7065229.html
Copyright © 2020-2023  润新知