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

    本文

    • 简单介绍
    • 正则实例分析
    • 正则 JS高程三内容 概述(复习)
    • 再来看一些正则实例

    一.简单介绍

    正则总是给我一种 四两拨千斤的感觉。

    ECMAScript 通过 RegExp 来支持正则表达式。
    const expression = / pattern / flags;

    • 模式就是我们的正则表达式。
    • 每个正则可以带有 1 或者 多 个标志
      • g:global,全局标志
      • i:ignore,表示不区分大小写
      • m:multiline,表示到达一行文本的末尾,还会继续查找下一行与文本匹配的。

    二. 正则实例分析

    概念是死的,如果我们只是去背概念,那我们每一次学习 都会跟 考古 似的。所以我们学习正则的方式应该是 多去写 正则相关的题目。


    来看看我所接触过的正则吧~

    let array = ' 桃李春风 一杯酒,江湖夜雨十 年灯 ';

    1. JS去除空字符串(对比一下,不用正则和用正则?)

    法一(最土的办法==) (非正则办法) - 去除 所有的 空格
    const way1 = (str) => {
      let res = [];
      for (let i = 0; i < str.length; i++) {
        if (str[i] !== ' ') {
          res.push(str[i]);
        }
      }
      return res.join('');
    }
    
    法二(稍微先进一点,石器时代) - 利用 数组方法 filter
    const way2 = (str) => {
      return str.split('').filter(item => item !== ' ').join('');
    }
    console.log(way2(array));
    
    法三(现代)
    const way2 = (str) => {
      return str.replace(/s/g, '');
    }
    

    现代人有现代人的问题,我们把小问题升级。 去除开头和结尾的空格。

    法一(铁器时代)
    const trim = (str) => {
      let pre,next;
      for (let i = 0; i < str.length; i++) {
        if (str[i] !== " ") {
          pre = i;
          break;
        }
      }
      for (let i = str.length - 1; i >= 0; i--) {
        if (str[i] !== " ") {
          console.log(i);
          next = i;
          break;
        }
      }
      str = str.substring(pre, next+1); // (start, end] 所以要 +1
    }
    trim(array);
    
    法二(正则)- 一旦局势复杂起来,正则的作用就更加明显了。
    const trim = (str) => {
      return str.replace(/^(s*)|(s*)$/g, "");
    }
    console.log(trim(array));
    
    法三. ES5 基本包装类型 String 自带的方法 trim/trimLeft/trimRight

    其实,ES5 早已给了我们方法,只需要调用就可以了
    。完全不需要我们去实现 函数 ==

    console.log(array.trim());
    

    三. 正则高程三

    A.正则有几个没有什么卵用的属性

    • global
    • ignoreCase
    • lastIndex (这个还挺有用,特别是exec的时候)
    • multiple
    • source

    他们是干什么的呢?简单来说,就是返回 正则一些的 属性,就跟 length 差不多吧。

    问题在于,正则本身的样子已经很清楚了。就像,我是个男的,你却对我问 你是不是男的?? ,考虑到汉语的博大精深,这里只考虑 符合理性和逻辑 的用法。我是男的难道 你眼睛 看不出来???

    所以说这些属性没有什么卵用嘛。不过还是拿来用用试试?不用你怎么知道我有多菜??

    const reg = /chen{8}/gi;
    console.log(reg.global);     // true, 废话,表达式里写了 g
    console.log(reg.ignoreCase); // true, 废话,表达式里写了 i
    console.log(reg.multiline);  // false,废话,表达式没写 m
    console.log(reg.lastIndex);  // 0 ,现在查到 0,注意,这个是可以遗传给下一次匹配的
    console.log(reg.source);     // chen{8}
    

    B. 正则对象的实例方法

    1. exec

    使用方法: reg.exec(str)
    返回:若有匹配项,则返回一个数组(有两个额外的属性indexinput);若无匹配则返回null

    • index - 匹配项在字符串中的位置
    • input - 应用正则表达式的字符串
    const reg = /chen/gi;
    let str = "chen323";
    console.log(reg.exec(str)); // ['chen', index: 0, input: 'chen323']
    

    而返回的数组中。

    1. 第一项是与整个模式匹配的字符串。
    2. 第二项是与模式中的捕获组匹配的字符串。
    3. 第三项...捕获组的捕获组...
      ...

    我想到了一首歌:

    如果你愿意一层一层一层的剥开我的心
    你会发现你会讶异
    你是我最压抑
    最深处的秘密

    var text = 'read write and dream';
    var pattern = /read( write and( dream))/gi;
    var matches = pattern.exec(text);
    console.log(matches[0]); // read write and dream
    console.log(matches[1]); // write and dream
    console.log(matches[2]); // dream
    
    这里还要注意一件事情。连续地使用 exec 和 flags-g 的关系

    1.如果使用 /g

    var text = "678";
    var reg = /(d)/g;
    for (let i = 0; i < 3; i++) {
      console.log(reg.exec(text));
      console.log(reg.lastIndex);
    }
    // ['6', '6', index: 0, input: '678']
    // 1
    // ['7', '7', index: 1, input: '677']
    // 2
    // ['8', '8', index: 2, input: '678']
    // 3
    

    2.如果不使用 /g

    var text = "678";
    var reg = /(d)/;
    for (let i = 0; i < 3; i++) {
      console.log(reg.exec(text));
      console.log(reg.lastIndex);   // 永远都是 0
    }
    

    这样的话,三次都会返回 ['6', '6', index: 0, input: '678']

    另外,reg.test方法的/g模式也会影响到 reg.execlastIndex,上面的循环中使用reg.test也是一样的。

    2. test方法

    若是匹配返回 true,若是无匹配,返回 false,常用于 if 判断

    var text = /000-00-000/;
    var pattern = /d{3}-d{2}-d{3}/;
    if (pattern.test(text)) {  // true
      console.log("成功匹配"); // 成功匹配
    }
    

    C. 正则构造函数属性

    • input($_)
    • lastMatch($&)
    • lastParen
    • leftContext
    • multiline
    • rightContext
    这里待更。(时间原因)

    除此之外,还有多达 9个 存储获取组 的构造函数属性。在我们调用exectest的时候,它们会被 自动填充。

    const r = /^(d{4})-(d{1,2})-(d{1,2})$/;
    const x = r.exec('1992-32-23');
    console.log(RegExp.$1, RegExp.$2); //  1992  32
    

    MDN文档

    var re = /(w+)s(w+)/;
    var str = 'John Smith';
    str.replace(re, '$2, $1'); // "Smith, John"
    RegExp.$1; // "John"
    RegExp.$2; // "Smith"
    

    四.还是一些实例。常用常新

    // todo

    一.简单介绍
    二.正则实例分析
    三.正则高程三
    四.未完待续

  • 相关阅读:
    级联操作
    深入解析http协议
    http状态码
    数据库在一对一、一对多、多对多怎么设计表关系
    [转载]C#深拷贝的方法
    TraceSource记录程序日志
    .NET 垃圾回收与内存泄漏
    DevExpress GridControl使用方法总结
    DevExpress使用技巧总结
    Oracle 错误代码小结
  • 原文地址:https://www.cnblogs.com/can-i-do/p/7456691.html
Copyright © 2011-2022 走看看