正则动态校验小数位数---不确定输入框内小数点后面有几位小数

165 阅读3分钟

前言

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

正则的写法

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

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

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

image.png

image.png

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.正则表达式中需要转义的字符(字符问题)

  • 特殊字符:这些字符在正则表达式中有特殊的含义,例如 [ ] { } ( ) \ ^ $ . | ? * +。它们用于执行更强大的搜索。

image.png

例如

/\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("/")) ); // 找到了 /

5.总结

  • 如果正则用到变量,那么需要用模板字符串来写,也就只能用new RegExp('正则表达式')创建一个RegExp对象
  • 要在字面意义上搜索特殊字符 [ \ ^ $ . | ? * + ( ),我们需要在它们前面加上一个反斜杠 \(“转义它们”)。
  • 如果在 /.../ 内(但不在 new RegExp 内),我们还需要转义 /字符。
  • 当将字符串传递给给 new RegExp 时,我们需要双反斜杠 \,因为字符串引号会消耗一个反斜杠。