相关文章推荐
爱笑的葫芦  ·  web.config 文件 | ...·  1 年前    · 
玩足球的灯泡  ·  MySQL 选择题 ...·  1 年前    · 
讲道义的松树  ·  【杂谈】Spring Boot ...·  1 年前    · 

最近用到了正则校验,之前也写过,这次需求不一样,所以又遇到了很多写法上的问题,感觉这么写是没问题的,但是页面上又没有生效,也确实很难受啊,所以现在问题解决后,认为还是有必要整理一下正则的问题!

正则的写法

1.第一种方式是直接通过 /正则表达式/ 写出来(正则表达式符号)

正则表达式符号为 "/ /" ,即为2个斜杠,中间为匹配规则。JavaScript中类似的特殊符号还有数组“[]”, 对象“{}”。

var re1 = /ABC\001/; 
re1; // /ABC\001/
/ABC\001/.test('ABC\001'); // true
/ABC\001/.test('ABC001'); // false

2.第二种方式是通过new RegExp('正则表达式')创建一个RegExp对象

两种写法是一样的,不过这里值得注意的是--------------------------------------------

  • 注意里面的\\,第一个是转义字符,作用是将第二个转为普通字符,所以正则里面实际只匹配一个\
  • var re2 = new RegExp('ABC\\001'); 
    //注意里面的'\',第一个\是转义字符,作用是将第二个转为普通字符 ,第二个\被转义为普通字符
    re2; // /ABC\001/
    /ABC\001/.test('ABC\001'); // true
    /ABC\001/.test('ABC001'); // false
    

    3.比较两种方式

    var re1 = /ABC\001/;
    var re2 = new RegExp('ABC\\001');
    
  • 使用正则表达式符号创建的正则是没有引号的,意味着这样的创建方法,我们没有办法写模板字符串,也就不能动态的书写我们想要的正则表达式,如果想要动态的正则表达式,只能是通过第二种方式,创建RegExp对象。例如:
  • //input框中只能输入最多8位小数的数字
    //e.target.value.replace(/[^\d-]*(\d*(?:\.\d{0,8})?).*$/g, '$1')
    //后来需求变了,不能确定是8位小数,要根据后端返回来的精度确定,所以改成了下面这种,也就是加了模板字符串
    //里面的\\, 第一个\为转义字符
    var num = 3
    const reg =new RegExp(`[^\\d-]*(\\d*(?:\\.\\d{0,${num}})?).*$`, 'g')
    e.target.value = e.target.value.replace(reg, '$1')
    
  • 第二种方式对比第一种的话,正则表达式里面是多了个转义字符,这也就是值得我们注意的地方,只要是正则表达式中有特殊字符,我们想把特殊字符当作普通字符来用的话,就需要转义。转义字符也就是\。比如我们想要找到一个点号 .,要将特殊字符用作常规字符,请在其前面加上反斜杠:\.,其他的字符根据情况转义。
  • 4.正则表达式中需要转义的字符(字符问题)

  • 特殊字符:这些字符在正则表达式中有特殊的含义,例如 [ ] { } ( ) \ ^ $ . | ? * +。它们用于执行更强大的搜索。
  • /\d\.\d/是匹配 字符.字符 所以只要字符中间有点就会通过
    /\d\.\d/.test('Chapter 51.1'); // true
    /\d\.\d/.test('Chapter 511'); // false
    alert( "Chapter 51.1".match(/\d\.\d/) ); // 51.1
    alert( "Chapter 511".match(/\d\.\d/) ); // null(寻找一个真正的点 \.)
    alert( "function g()".match(/g\(\)/) ); // "g()"
    alert( "1\\2".match(/\\/) ); // '\'
    
  • 斜杠符号 '/' 并不是一个特殊字符,但是它被用于在 Javascript 中开启和关闭正则匹配:/...pattern.../,所以我们也应该转义它。
  • 从另一个方面看,如果我们没使用 /.../,而是使用另一种 new RegExp 的方式创建正则表达式,则不需要转义斜杠:
  • alert( "/".match(/\//) ); // '/'
    alert( "/".match(new RegExp("/")) ); // 找到了 /
    
  • 如果正则用到变量,那么需要用模板字符串来写,也就只能用new RegExp('正则表达式')创建一个RegExp对象
  • 要在字面意义上搜索特殊字符 [ \ ^ $ . | ? * + ( ),我们需要在它们前面加上一个反斜杠 \(“转义它们”)。
  • 如果在 /.../ 内(但不在 new RegExp 内),我们还需要转义 /字符。
  • 当将字符串传递给给 new RegExp 时,我们需要双反斜杠 \,因为字符串引号会消耗一个反斜杠。
  • Daisy_
    私信