zoukankan      html  css  js  c++  java
  • 正则表达式

    一、概况

    1、正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

    2、正则引擎主要可以分为两大类:一种是DFA,一种是NFA。许多程序设计语言都支持利用正则表达式进行字符串操作。

    二、组成

      1.定界符

    ^ 匹配输入字符串的开始位置。
    $ 匹配输入字符串的结束位置。

      2.修饰符

    i 执行对大小写不敏感的匹配。
    g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
    m 执行多行匹配。

      3.方括号 代表一类字符的集合

    [abc] 查找方括号之间的任何字符。
    [^abc] 查找任何不在方括号之间的字符。
    [0-9] 查找任何从 0 至 9 的数字。
    [a-z] 查找任何从小写 a 到小写 z 的字符。
    [A-Z] 查找任何从大写 A 到大写 Z 的字符。
    [A-z] 查找任何从大写 A 到小写 z 的字符。
    [adgk] 查找给定集合内的任何字符。
    [^adgk] 查找给定集合外的任何字符。
      4.元字符  代表一类字符的集合
    元字符描述
    . 查找单个字符,除了换行和行结束符。
    w 查找单词字符。
    W 查找非单词字符。
    d 查找数字。
    D 查找非数字字符。
    s 查找空白字符。
    S 查找非空白字符。
     匹配单词边界。
    B 匹配非单词边界。
    查找 NUL 字符。
    查找换行符。
    f 查找换页符。
    查找回车符。
    查找制表符。
    v 查找垂直制表符。
    xxx 查找以八进制数 xxx 规定的字符。
    xdd 查找以十六进制数 dd 规定的字符。
    uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。

    5.量词

    n+ 匹配任何包含至少一个 n 的字符串。
    n* 匹配任何包含零个或多个 n 的字符串。
    n? 匹配任何包含零个或一个 n 的字符串。
    n{X} 匹配包含 X 个 n 的序列的字符串。
    n{X,Y} 匹配包含 X 至 Y 个 n 的序列的字符串。
    n{X,} 匹配包含至少 X 个 n 的序列的字符串。
    n$ 匹配任何结尾为 n 的字符串。
    ^n 匹配任何开头为 n 的字符串。
    ?=n 匹配任何其后紧接指定字符串 n 的字符串。
    ?!n 匹配任何其后没有紧接指定字符串 n 的字符串。

    6.捕获组(子组)

    () 括号内的为子组内容


    三、js正则使用

        对象方法
        var reg=new Regexp();
        reg.compile(regexp,string)    编译正则表达式
        reg.exec(string)            检索字符串中指定的值。返回找到的值,并确定其位置
        reg.test(string)            检索字符串中指定的值。返回 truefalse。
        
          字符串方法
        str.search(regexp)            检索与正则表达式相匹配的值。
        str.match(regexp)            找到一个或多个正则表达式的匹配。
        str.replace(regexp)            替换与正则表达式匹配的子串。
        str.split(regexp)            把字符串分割为字符串数组。

    四、例子

    1、去除空格

        // s为元字符 空格, ^$为定界符
            var str1=' h e l l o ';
            var strRe1=str1.replace(/s*/g,'');    //去除所有空格 g全局的作用  得到所有的匹配项
            var strRe2=str1.replace(/^s*|s*$/g,''); //去除左右空格
            console.log(str1.length,strRe1.length,strRe2.length);//11 5 9

     2、替换指定字符  

      // g为全局修饰符 无替换一次 有替换所有
      let str ='addtr1 23kn791addkn tr';
      let nstr=str.replace(/kn/,function(v){
        return '黑白kn';
      })
      console.log(nstr)//addtr1 23黑白kn791addkn tr
      let gnstr=str.replace(/kn/g,function(v){
        return '黑白kn';
      })

      console.log(gnstr)//addtr1 23黑白kn791add黑白kn tr

    3、查找url地址

        /*    
      ?:     关闭分组的捕获功能 http :查找http s? :0个或一个s // :查找// 是转义区分表达式的开始结束 w+ :元字符 字母数字下划线 +一个或多个 (.w+)*:()分组 . 点 区分元字符所有 w+同上 +一个或多个分组的内容 (?S*)?: 一个?转义问号 /S非空格 * 0或多个
    */ var reg=new RegExp(/https?://w+(.w+)+(?S*)?/); // var reg=new RegExp(/https?://w+(.w+)+/); var str3='百度http://www.baidu.com.cn?usrname=kn'; // 两个结果一样 console.log(reg.exec(str3)); console.log(str3.match(reg))

    //0为全部表达式结果 1为第一个()分组 2为第二个()分组
     

     4、查找素数

        // 1111 1       false   5
        // 1111 111     false   7
        // 111 111 111  true    9
        // 11 11 11 11 11  true    10
        var str=Array(9+1).join('1');
        console.log(/^(11+?)1+$/.test(str));//判断是否为质数的正则
        // console.log(str.match(/^1?$|^(11+?)1+$/));
        //(11+?) 消除贪婪 从最小范围往 大范围找 (1(1+?))
        //()     捕获组
        //1     反向引用,使用第一个捕获组
    
        var t=[];
        for(var i=2;i<10;i++){
            if(!/^(11+?)1+$/.test(Array(i+1).join('1'))){
                t.push(i);
                t.join('	');
            }
        }
        console.log(t);
    

     5、千分位

    //?=N 匹配任何其后紧接指定字符串 n 的字符串。
    //?!N 匹配任何其后没有紧接指定字符串 n 的字符串。
      let num='5201314' let nnum=num.toString().replace(/(?=(d{3})+(?!d))/g, ",");
    //简化
    //5,201,314 true
    //52,014,14 false
    //520,131,4 false
      num.toString().replace( /(?=(d{3})+$)/g, ',');

    6、验证ip的合法性

     1     var str="1.1.1.1;2.2.2.2;255.255.255.255;0.0.0.0"
     2     function regCheckIp(val){
     3         var reg=/^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$/
     4         var arr=val.replace(/^s*|s*$/g,'').split(';')
     5         for(var i in arr){
     6             if(arr[i].search(reg)==-1){
     7                 return true;
     8             }
     9         }
    10         return false;
    11     };
    12     regCheckIp(str)

     7、获取文件后缀名

    1     function validate(str){ 
    2         var a=str.split('.').pop();
    3         console.log(a)   //txt
    4         /*var d=str.match(/.[^.]+$/)
    5         console.log(d) //[".txt", index: 8, input: "test.1.3.txt"]*/
    6     } 
    7     validate("test.1.3.txt")

     8、模板替换 [],{{}}

        /*********7、模板替换功能************************************************************/
            // var reg = new RegExp("\[([^\[\]]*?)\]", 'igm'); 匹配 [] 内的内容替换
        var reg = /{{(.+?)}}/g;        //匹配 {{}} 的内容替换
        var html="[title]--[dateA]--{{title}}---{{dateA}}"
    
        var source = html.replace(reg, function (node, key) {
    
            return {
                'title': '我是hbuilder啊,哈哈哈哈',
                'dateA': '2016-09-19'
            }[key];
        });
        console.log(source)
     
     
     
  • 相关阅读:
    arguments.callee
    vue的生命周期
    Vue中的v-cloak用法
    控制input只能输入数字和两位小数
    css3新单位vw、vh的使用详解
    关于图片的Base64编码
    Logic and Fault simulation
    scan design flow(二)
    scan design flow(一)
    异构计算
  • 原文地址:https://www.cnblogs.com/blog-index/p/6604927.html
Copyright © 2011-2022 走看看