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");

JS 去除小数点后多余的 0open in new window

TIP

个人理解,正则 g 后缀修饰符,replace 替换的时候要加,test 测试的时候不需要加。

Last Updated:
Contributors: Vsnoy