zoukankan      html  css  js  c++  java
  • javascript中的正则

    一、js中的正则就是用来处理字符串的。

    1、验证字符是否符合规则---》匹配

    2、获取字符串中符合规则的内容---》捕获

    二、js中定义正则创建方式:

    1、字面量创建;    //var reg = /d/;

    2、实例创建方式;   //var reg = RegExp();

    三、两种方式的区别:

    1、实例创建遇到d等要多加一个

    2、实例创建可以进行字符串拼接。可以把一个变量放到正则中作为规则字符串

    四、正则组成:元字符和修饰符

    元字符分为:特殊元字符,量词元字符,普通元字符

    1、特殊元字符

     d: 代表0-9之间的一个数字   === [0-9]

     w: 数字、字母、下划线中的任意一个字符  ===  [a-zA-Z0-9_]

      : 一个换行

     s: 一个空白字符(空格 制表符)

     : 匹配一个边界(字母和空格之间也是边界)

     ^: 以某一个元字符开始

     $: 以某一个元字符结束

     .: 除了 意外的任意一个字符

     : 转义符

     |: 或者

    (): 分组,或者打正则中的一个小正则

    [xyz]: x、y、z其中的一个

    [^xyz]: 除了xyz之外的任意一个

    [] 包起来的字符都是代表本身意思,没有特殊意义。例如,“.+”

    2、量词元字符

     *: 出现零到多次

     +:一到多次

     ?:零或者一次

     {n}: 出现n次

     {n,}:n到多次

     {n,m}:n到m次

    3、普通元字符

      所有的字符都可以作为普通元字符,普通元字符就代表自己本身意思的字符。

    4、修饰符

    i:ignoreCase 忽略大小写

    g:global  全局匹配

    m: multiline  匹配换行

    五、RegExp对象方法

    1、exec

      捕获。返回一个数组,其中存放匹配结果。如果未找到匹配,则返回值为null。每次只能捕获一个内容,如果需要多次匹配需要添加g修饰符。然后循环捕获匹配的内容。那么有没有可以一次捕获到所有内容的呢。当然,字符串中有一个match可以做到。but它也有一些自己的弊端。后面会介绍字符串的匹配方法。

      例如:返回 ["2015", index: 2, input: "你好2015,我在2016"]

         数组第一项:当前正则捕获到的内容,第二项:index是捕获到内容的索引,第三性:input是捕获的那个原始字符串

      正则的捕获分为两个阶段:

      1)先匹配,匹配成功在进行捕获,匹配不成功返回null

      2)按照进行捕获

    2、test

        匹配。匹配字符串中制定的值。返回true或者false。

    六、正则的两个特性,既懒惰又贪婪

      1、懒惰,默认执行一次exec只把第一个符合规则的捕获到,第二及以后的都不捕获

        取消捕获的懒惰性用全局修饰符g来处理,例子:

        var reg = /d+/g;  //或者 var reg = new RegExp("\d+","g");
        var str = "我们公司2015年有2500名员工,其中百分之60都是80后。";
        var res = reg.exec(str);
    
        while(res){
            console.log(res);
            res = reg.exec(str);
        }

      2、贪婪,每一次都按照规则最长的进行捕获

       取消正则的贪婪性:

       1)?如果放在普通元字符后面他就是量词元字符,代表出现0-1次

       2)?如果放在量词元字符后面,代表取消正则的贪婪捕获

       例子:

        var str = "我们公司2015年有2500名员工,其中百分之60都是80后。";
        var reg = /d+?/g;
        console.log(reg.exec(str));
        console.log(str.match(reg));

     七、正则中的分组

      1、分组捕获

      如果一个正则中存在分组,在捕获的时候,可以把分组中的内容获取到

      如果在使用分组时,只想匹配,不想捕获时,只需要在分组的最前面加 ?: 即可

      例如下面的代码:

        var str = "我们公司2015年有2500名员工,其中百分之60都是80后。";
        var reg = /(?:d+)([u4e00-u9fa5]+,?)/g;
        var ary = reg.exec(str);
        console.log(ary);

      //ary[0]  大正则捕获的内容
      //ary[1]  第一个分组(不加?:的第一个分组)捕获的内容
      //ary[2]  第二个分组(不加?:的第二个分组)捕获的内容
      //...
      //ary[n]  第n个分组(不加?:的第n个分组)捕获的内容

       说到分组捕获,上面提到的字符串match方法,虽然可以一次捕获所有内容,但是不能捕获分组中内容。

        var reg = /(d+)/g;
        var str = "我们公司2015年有2500名员工,其中百分之60都是80后。";
        console.log(str.match(reg));

      2、正则中的分组引用

      正则中某一部分需要和另外一部分一模一样,使用分组引用处理。

      例如:

    var reg = /^([a-z])([a-z])21$/;
    console.log(reg.test("woow"));
    
    //  1 是第一个分组的引用,必须和第一个分组一模一样的内容才可以
    //  2 是第二个分组的引用,必须和第二个分组一模一样的内容才可以

    八、支持正则表达式的String对象的方法

      1、replace  替换与正则表达式匹配的子串。返回一个新的字符串。

        有两个必填函数:

       1)规定字符串,或者要替换的正则对象

         第一个参数如果是正则,每匹配一次replace方法就执行一次(不要忘记加g)

       2)可以是字符串或生成替换文本的函数

        第二个参数是function,每捕获一次函数就执行一次,不光是执行,执行的时候浏览器还默认传递了参数

        var str = "welcome to jin ji lie liu xue! good good study, day day up!";
        var reg = /(?:^| +)?([a-z]+)(?: +|$)?/g;
        str = str.replace(reg,function(){
            // console.dir(arguments);
            //我们当前能够进行捕获的分组只有一个,传进来的参数有四个。
            //第一个:大正则捕获的内容   arguments[0]     == exec ary[0]
            //第二个:第一个分组捕获的内容 arguments[1]    == exec ary[1]
            //第三个:打正则捕获的开始索引    arguments[2]    == exec index
            //第四个:原始字符串    arguments[3]    ==     exec input
    
            // var tar = arguments[1];    //每一次匹配,第一个分组捕获的内容
            var tar = RegExp.$1;
            var f = tar.charAt(0).toUpperCase();
            tar = f + tar.substr(1);
            return " " + tar;
        });
    
        console.log(str);
  • 相关阅读:
    20210329 3. RocketMQ 高级实战
    20210329 2. RocketMQ 高级特性及原理
    20210329 1. RocketMQ 架构与实战
    20210329 0. RocketMQ 安装
    20210311 java.io.Serializable
    Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments
    Reinforcement Learning in Continuous Time and Space
    A Learning Theory for Reward-Modulated Spike-Timing-Dependent Plasticity with Application to Biofeedback
    Functional Requirements for Reward-Modulated Spike-Timing-Dependent Plasticity
    BindsNET学习系列 ——Reward
  • 原文地址:https://www.cnblogs.com/dollarzhang/p/4650887.html
Copyright © 2011-2022 走看看