Regex
规则
字符组
[abc] 字符集
[^abc] 否定字符集
[a-z] 范围
. 点。通配符,表示几乎任意字符。
\d 数字。[0-9] 简写。
\D 非数字
\w 单词。[0-9a-zA-Z_] 简写。
\W 非单词
\s 空白符。[ \t\v\n\r\f] 简写。
\S 非空白符
量词
{m} 出现 m 次
{m,} 出现 m 次及以上
{m,n} 出现 m 到 n 次
? 出现 0 到 1 次
* 出现 0 次及以上
+ 出现 1 次及以上
位置
^ 开头
$ 结尾
\b 单词边界
\B 非单词边界
(?=) 正向先行断言。前瞻。
(?!) 负向先行断言
(?<=) 正向后行断言。后顾。
(?<!) 负向后行断言
分支分组
| 分支
() 分组
修饰符
i 忽略大小写
m 多行
g 全局
变量引用
字面量形式的正则无法对变量进行引用,这时候需要用到构造函数的形式来创建。
const key = '白色相簿'
const str = '又到了白色相簿的季节了'
const reg = new RegExp(`(${key})`, "g");
str.split(reg) // ['又到了', '白色相簿', '的季节了']
案例
空格
左侧空格
/^\s*/g
右侧空格
/\s*$/g
左右空格
/(^\s*|\s*$)/g
所有空格
/\s*/g
密码
密码 8-12 位,由大小写字母和数字组成,其中至少包括一个大写字母,一个小写字母,一个数字
/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,12}$/g
时间(24 时制)
/^([01][0-9]|2[0-3]):[0-5][0-9]$/g
日期(yyyy-mm-dd)
/^[0-9]{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])$/g
手机号
/^1[3-9][0-9]{9}$/g
身份证号
/^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/g
十六进制颜色
/^#([0-9a-f]{3}|[0-9a-f]{6})$/ig
金额千分位分割
纯数字千分位
/(?!^)(?=(\d{3})+$)/g
带小数千分位
/(?!^)(?=(\d{3})+\.)/g
表单
输入框数字小数
- 去除两边空白
- 只能包含数字、小数点
- 只保留第一个小数点,第二个小数点及之后的数全部去掉
- 小数点后没有数字,去掉小数点
- 小数点前没有数字,自动补 0
- 去除小数点后末尾的 0
// 正则顺序很重要,不能随意调换
input_value
.replace(/\s*/g, "")
.replace(/[^\d.]/g, "")
.replace(".", "$#$")
.replace(/\..*$/g, "")
.replace("$#$", ".")
.replace(/\.$/g, "")
.replace(/^\./g, "0.")
.replace(/(?:\.0*|(\.\d+?)0+)$/, "$1");
TIP
个人理解,正则 g 后缀修饰符,replace 替换的时候要加,test 测试的时候不需要加。