当前位置: 首页 > 工具软件 > tracy > 使用案例 >

Tracy JS 小笔记 - 正则表达式

鲍鸿波
2023-12-01

正则表达式的作用

字符串匹配的利器

转义字符

  • var str = "就想在双引号里写双引号\"怎么办?"
  • 反斜线会把它后面的字符取消掉它的语法意思
  • \n : 换行
  • \r : 行结束符
  • 一个回车等于 : \n\r
  • \t : tab 缩进,等于4个空格
  • \f:
  • 多行字符串

    var text = "\
    <div></div>\
    <div></div>\
    ";
    
    var text = `<div></div>
    <div></div>`;

正则表达式

视频

  • 匹配特殊字符或有特殊搭配原则的字符串的最佳选择
  • 它不是 JS 独有的,它是单独的一个
  • 两种创建方式
    • 直接量(推荐)
      • 它是一个对象,写的方式是 //
        var reg = /abc/; //正则表达式字面量
        var str = "abcd";
        reg.test(str); //true 测试字符串 str 是否含有我正则规定的片段
      • 正则表达式的属性
        • i : var reg = /abc/i; //ignoreCase 忽略大小写
        • g :执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
          var str = "abababab";
          var reg = /ab/;
          var a = str.match(reg); //只返回一个 ab
          var reg = /ab/g;
          var b = str.match(reg); //返回所有 ab,组成一个数组,可以查看.length 来看字符串里有多少个 ab
        • m :执行多行匹配。
          var str = "abc\na";
          var reg = /^a/g; //以a开头的
          var a = str.match(reg); //只返回一个 a
          var reg = /^a/gm; //以a开头的
          var b = str.match(reg); //只返回所有 a 组成数组
        • 可以把三个属性自由组合 var = /abc/mig;
    • new RegExp();
      • var reg = new RegExp("abc");
        var str = "abcd";
        reg.test(str); //true
      • var reg = /abc/;
        var reg1 = new RefExp(reg);//这两个对象虽然形式上一样了,但是相对独立,自己加属性不会相互干扰
        var reg2 = RefExp(reg);//这个 reg 和 reg2 就是指向同一个引用了,一个变两一个会跟着变了
      • 同样可以写属性,只不过在构造函数的第二个参数上实现
        var reg = new RegExp("abc", "igm");
    • 正则表达式方法 .test() //返回结果只有 true 和 false

      var reg = /abc/;
      var str = "abcd";
      reg.test(str); //true

    • 字符串方法 .match() //把匹配的结果都返回回来

      var str = "abababab";
      var reg = /ab/;
      var a = str.match(reg); //只返回一个 ab
      var reg = /ab/g;
      var b = str.match(reg); //返回所有 ab,组成一个数组,可以查看.length 来看字符串里有多少个 ab

    • 字符串方法 .replace()
      var str = "aa";
      console.log(str.replace("a", "b")); //输出 ba 因为 replace 本身没有匹配所有 a 的能力
      var reg = /a/;
      console.log(str.replace(reg, "b")); // 也输出 ba
      var reg = /a/g; //带上全局属性 g 后
      console.log(str.replace(reg, "b")); // 输出 bb

      var reg = /(\w)\1(\w)\2)/; var str = "aabb";
      console.log(str.replace(reg, "$2$2$1$1")); //输出 bbaa, 这里的 $1 代表引用正则里的第一个表达式所筛选数来的值
      console.log(str.replace(reg, function($,$1,$2){
      return $2 + $2 + $1 + $1;
      //这里的 $ 代表整个 str
      }));
  • 之前的 var reg = /abc/g; 是一个固定的写法,如果我们想要一个三个任意数字组成的字符串,那么就需要用表达式
    括号用于查找一定范围的字符串:
    • [abc] 查找方括号之间的任何字符。 一个括号,代表一位
      var reg = /[0123456789][0123456789][0123456789]/g 三个任意数字组成的字符串
    • [0-9] 查找任何从 0 至 9 的数字。
      var reg = /[0-9][0-9][0-9]/g 三个任意数字组成的字符串
      var reg = /[0-9A-Za-z]/g 任意数字和字符串
    • 尖角号放在表达式里代表 “非”
      var reg = /[^a][^b]/g; 查找所有第一位不是a 第二位不是b 的两位字符串
      var str = "ab1cd"; str.match(reg); //返回 ["b1", "cd"]
    • (x|y) 查找由 | 分隔的任何选项。

      var reg = /(abc|bcd)/g; 查找所有 abc 或者 bcd
    • reg = /(\w)\1\1\1/; 这里的括号代表子表达式,这括号会记录里面匹配的内容; \1 代表引用第一个子表达式里匹配出的内容,所以这个就匹配 aaaa 或者 bbbb 等 四个一样的数字,字母,加下划线
    • reg = /(\w)\1(\w)\2/ 这个就匹配 aabb 了
    元字符 (Metacharacter)是拥有特殊含义的字符:
    • \w === [0-9A-z_] 就是数字,字母,加下划线
      var reg = /\w/g
    • \W === [^\w] 所有 非数组并且非字母并且非下划线
    • \d === [0-9]查找数字。 试一试
    • \D === [^\d] 查找非数字字符
    • \s === [\t\n\r\v\f ] 查找空白字符。 试一试
    • \b 匹配单词边界。 试一试
      var str = "abc bcd deg"; //有6个单词边界
      var reg = /\btracy\b/; 查到单词 tracy
    • \uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。 比如说可以匹配汉字,我们先把汉字转换成 Unicode
    • 如何匹配一切单个字符 : var reg = /[\d\D]/g; 利用补集
    • . 查找单个字符,除了换行和行结束符。 差不多就代表一切了
    量词
    • n+; 代表 n 这个变量可以出现 一次到无数次
      var reg = /\w+/g;
    • n * 0到无数次
    • 正则表达式匹配原则: 贪婪匹配
  • reg.exec(); 方法 检索字符串中指定的值。返回找到的值,并确定其位置。
    var reg = /ab/g;
    var str = "ababab";
    console.log(reg.exec(str));
    reg 挂着 g 属性的时候,游标在向后变化,所以在第4次执行 reg.exec(str) 会返回 null; 游标就是 reg.lastIndex 属性
    如果 不挂着 g, 游标不变 一直为 0
    • var reg = /^\d[\s\S]*\d$/g; 检测一个字符转首尾是否有数字
    • 把 the-first-name 变成小驼峰 theFirstName
      规律就是把 -f 变成 F,把 -n 变成 N
      var reg = /-(\w)/g;
      var str = "the-first-name";
      var str2 = str.replace(reg, function($,$1){return $1.toUpperCase();});
    • 科学计数法
      var str = 10000000;// 变成 10.000.000
      var reg = /(?=(\B)(\d{3})+$)/g;
      var str2 = str.replace(reg,".");

1 . 校验密码强度

密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。

^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$

2. 校验中文

字符串仅能是中文。

^[\\u4e00-\\u9fa5]{0,}$

3. 由数字、26个英文字母或下划线组成的字符串

^\\w+$

4. 校验E-Mail 地址

同密码一样,下面是E-mail地址合规性的正则检查语句。

[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?

5. 校验身份证号码

下面是身份证号码的正则校验。15 或 18位。

15位:

^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$

18位:

^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$

6. 校验日期

“yyyy-mm-dd“ 格式的日期校验,已考虑平闰年。

^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$

7. 校验金额

金额校验,精确到2位小数。

^[0-9]+(.[0-9]{2})?$

8. 校验手机号

下面是国内 13、15、18开头的手机号正则表达式。(可根据目前国内收集号扩展前两位开头号码)

^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$

9. 判断IE的版本

IE目前还没被完全取代,很多页面还是需要做版本兼容,下面是IE版本检查的表达式。

^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$

10. 校验IP-v4地址

IP4 正则语句。

\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b

11. 校验IP-v6地址

IP6 正则语句。

(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

12. 检查URL的前缀

应用开发中很多时候需要区分请求是HTTPS还是HTTP,通过下面的表达式可以取出一个url的前缀然后再逻辑判断。

if (!s.match(/^[a-zA-Z]+:\\/\\//))
{
    s = 'http://' + s;
}

13. 提取URL链接

下面的这个表达式可以筛选出一段文本中的URL。

^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?

14. 文件路径及扩展名校验

验证windows下文件路径和扩展名(下面的例子中为.txt文件)

^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$

15. 提取Color Hex Codes

有时需要抽取网页中的颜色代码,可以使用下面的表达式。

^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$

16. 提取网页图片

假若你想提取网页中所有图片信息,可以利用下面的表达式。

\\< *[img][^\\\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)

17. 提取页面超链接

提取html中的超链接。

(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>

18. 查找CSS属性

通过下面的表达式,可以搜索到相匹配的CSS属性。

^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}

19. 抽取注释

如果你需要移除HMTL中的注释,可以使用如下的表达式。

<!--(.*?)-->

20. 匹配HTML标签

通过下面的表达式可以匹配出HTML中的标签属性。

<\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[\\^'">\\s]+))?)+\\s*|\\s*)\\/?>


作者:技匠
链接:https://www.jianshu.com/p/e7bb97218946
来源:简书
著作权归作者所有。

 类似资料: