美文网首页
javascript正则表达式(一)

javascript正则表达式(一)

作者: 成熟稳重的李先生 | 来源:发表于2019-10-15 01:34 被阅读0次

    regular expression: RegExp
    正则,是用来处理字符串的规则

    • 只能处理字符串
    • 它是一个规则: 可以验证字符串是否符合某个规则(test), 也可以把字符串中符合规则的内容捕获到(exec/或者字符串的match)
    let str = "welcome";
    let reg = /\d+/;  // "+"代表1到多个,d代表数字
    reg.test(str);  // "test"方法,表示是否满足规则,显然,此处应该返回false
    
    str = "2019-08-12";
    reg.exec(str) // => ["2019", index: 0, input: "原始字符串"]
    

    编写正则表达式:
    创建方式有两种

    // => 字面量创建方式(两个斜杠之间包起来的,都是用来描述规则的元字符)
    let reg1 = /\d+/;
    // => 构造函数模式创建, 包含两个参数:元字符字符串  修饰符字符串
    let reg2 = new RegExp("\\d+");  //与字面量方式不同的是,转义符要写两个
    

    正则表达式有两部分组成

    • 元字符
    //常用元字符
    1. 量词元字符: 设置出现的次数(6种)
      *:      零到多次;
      + :     一到多次;  
      ?:     零次或者一次
      {n}:      出现n次; 
      {n, }:    n到多次; 
      {n, m}:   出现n到m次   (这三个都是闭区间)
    2. 特殊元字符: 单个或者组合在一起代表特殊的含义
      \    转义字符 (普通 -> 特殊 -> 普通)
      .    除\n(换行符)以外的任意字符
      ^    以哪一个元字符作为开始
      $    以哪一个元字符作为结束
      \n    换行符
      \d    0~9 之间的一个数字
      \D    非数字 (大写和小写意思是相反的)
      \w    数字,字母,下划线中的任意一个字符
      \W
      \s     一个空白字符(包含空格、制表符、换页符等)
      \S    非空字符
      \b    匹配一个单词的边界
      \t     一个制表符(一个TAB键: 四个空格)
      |      或(x|y  -> x或者y中的一个字符)
      [xyz]  匹配x,y,z中的一个字符
      [^xy]   除了x,y以外的任意字符
      [a-z]  指定a-z这个范围中的任意字符(类比[0-9],[A-Z])
          //[a-z0-9A-Z_]匹配a到z或者0到9或者A到Z再或者_中的任意一个   ===  \w
      [^a-z]   [a-z]取反
      ()    正则中的分组符号
      (?:)    只匹配,不捕获
      (?=)   正向预查
      (?!)    负向预查
    3.  普通元字符: 代表本身含义的
    /abc/    此正则就是匹配字符串“abc”
    
    • 修饰符
    /*正则表达式常用的修饰符: img*/
    i:    ignoreCase   忽略单词大小写匹配
    m:   multiline       可以进行多行匹配
    g:    global           全局匹配
    
    /A/.test("lalala") => false;
    /A/i.test("lalala") => true;   // 忽略了大小写
    

    元字符详细解析
    ^ $

    let reg = /^\d/;
    reg.test("regexp");   //false
    reg.test("2019regexp");  //true
    reg.test("regexp2019");  //false
    
    let reg = /\d$/
    reg.test("regexp");   //false
    reg.test("2019regexp");  //false
    reg.test("regexp2019");  //true
    
    // ^,$都不加 (字符串中包含符合规则的内容即可)
    let reg = /d+/;
    // ^, $都加: 字符串只能是和规则一致的内容
    let reg = /^\d+$/;
    // 验证手机号码(11位,第一个数字是1即可)
    let reg = /^1\d{10}$/;
    

    转义字符

    let reg = /^2.3$/   // . 不是小数点
    console.log(reg.test("2.3")) //true
    console.log(reg.test("2@3"))  //true
    console.log(reg.test("23"))  //false  (.表示任意字符,但必须有)
    //想要表示小数点,需要将.转义
    let reg = /^2\.3$/;
    
    let str = "\d";   \\要表示“\d”这个字符串,要这样写“\\d”
    reg = /\\d/;  // 这里转义字符的用处是将特殊字符转化为普通字符串
    console.log(reg.test(str))  // false (因为\在字符传中也是有特殊含义的)
    console.log(reg.test("\\d"))  //true   (字符串中也需要转义字符再转义)
    

    x|y

    let reg = /^18|29$/;
    console.log(reg.test("18"))   // true
    console.log(reg.test("29"))   // true
    console.log(reg.test("129"))   // true
    console.log(reg.test("189"))   // true
    console.log(reg.test("1829"))   // true
    console.log(reg.test("829"))   // true
    console.log(reg.test("182"))   // true
    //以上均为true,其实,我只是想匹配18或者29中的一个。 直接x|y会存在很乱的优先级问题,一般这种时候都伴随着小括号来进行分组,小括号可以改变处理的优先级  => 小括号: 分组
    reg = /^(18|29)$/;
    console.log(reg.test("18"))   // true
    console.log(reg.test("29"))   // true
    console.log(reg.test("129"))   // false
    console.log(reg.test("189"))   // false
    

    []

    //1. 中括号中出现的字符一般都代表本身的含义
    let reg = /^[@+]+$/;   // 第一个+,就是根本的+,第二个+是元字符(一个或者多个)
    reg.test("@@");
    reg.test("@+");
    // 也有特殊的
    reg = /^[\d]$/;  //  => \d在中括号中还是代表0-9
    console.log(reg.test("d"));    //false
    console.log(reg.test("\\"));    //false
    console.log(reg.test("9"));    //true
    // 2. 中括号中不存在多位数
    reg = /^[18]$/;
    console.log(reg.test("1"));    //true
    console.log(reg.test("8"));    //true
    console.log(reg.test("18"));    //false
    

    常用的正则表达式

    • 1.验证是否为有效数字
    / *
      * 规则分析
      * 1.可能出现+-号,也可能没有
      * 2. 一位时,0-9都可以;多位时,首位不能为0
      * 3. 小数部分可能有也可能没有,一旦有,后边必须有小数点+数字
      */
    let reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
    
    • 2.简单验证密码
    /  *
      *  数字,字母,下划线
      * 6-16位
    */
    let reg = /^\w{6, 16}$/;  //一定注意不能写成 /^\w+{6,16}$/,因为w+和后边表示位数的修饰符冲突了
    
    • 3.验证真实姓名的
    /   *
        * 1. 汉字  /^[\u4E00-\u9FA5]/  (背诵)
        * 2. 名字长度 2~10位
        * 3. 译名,可能有 “·”+汉字   “尼古拉斯·赵四”
        */
    let reg = /^[\u4E00-\u9FA5]{2,10}(·[\u4E00-\u9FA5]{2,10}){0,2}$/
    
    • 4.验证邮箱的
    /  *@之前
      * 1.开头是数字,字母,或者下划线(1到多位)
      * 2.接着可以是 “-”加数字字母下划线  或者 “.”加数字,字母下划线。整体零到多次
      *  a-b-c,a-b.c, a.b.c
      * 邮箱的名字由“数字,字母,下划线,-,.”几部分组成,但是-和.不能连续出现,也不能作为开始出现
      * @之后
      * 1. @后紧跟着:数字,字母 (1到多位)
      * 2. ((\.|-)[A-Z0-9a-z]+)*
      *  对@后边的名字的补充(匹配"45314515@16.com.cn"中的“.com”)
      *  企业邮箱  zxt@zhufeng-peixun-office.com (匹配“-peixun-office”)
      * 3. 最后 \.[A-Z0-9a-z]+
      * 用来匹配邮箱后缀 (.com/.cn/.org/.edu.....)
      */
    let reg = /^\w+((-\w+)|(\.\w+))*@[A-Z0-9a-z]+((\.|-)[A-Z0-9a-z]+)*\.[A-Z0-9a-z]+$/
    
    • 5.身份证号码
    / * 1. 一共18位
      * 2. 最后一位可能是X
      * 3. 身份证前六位: 省市县
      *        中间八位: 年月日
      *        最后四位: 
      *            最后一位: X或者数字
      *            倒数第二位 => 偶数 女, 奇数  男
      *            其余是经过算法算出来的
      */
    //let reg= /^\d{17}(\d|x)$/;
    // =>  小括号分组的第二个作用:分组捕获,不仅可以把大正则匹配的信息捕获到,还可以单独捕获到每个小分组的内容
    let reg = /^(\d{6})(\d{4})(\d{2})(\d{2})\d{2}(\d)(\d|x)$/   //捕获的结果是数组,包含每一个小分组单独获取的内容
    

    正则两种创建方式的区别
    在字符串中两个“\”,才是“\”的意思, 因此:

    let reg = /\d+/g;
    // 等同于:
    let reg = new RegExp("\\d+", "g")
    
    //正则包变量
    //  1.  两个斜杠中间包起来的都是元字符 (如果正则中要包含某个变量的值,则不能使用字面量方式创建)
    let type = "welcome"
    //  只能使用构造函数的方式(因为它传递的规则是字符串,只有这样才能进行字符串拼接)
    let reg = new RegExp("^@"+type+"@$", "g")
    

    两个正则图形化工具

    https://jex.im/regulex/
    https://regexper.com/

    相关文章

      网友评论

          本文标题:javascript正则表达式(一)

          本文链接:https://www.haomeiwen.com/subject/afidmctx.html