主题
常用正则
记录开发中的一些常用正则,使用时建议根据实际需求进行修改
由于格式化会在前面添加分号,故采用变量形式
常用关键字
符号 | 作用 | 用法示例 | 解释 |
---|---|---|---|
| | 或者(OR) | /yes|no/ | 匹配 yes 或者 no |
i | 忽略字母大小写 | /h/i | 匹配 h 或者 H |
g | 查询整个字符串 | /ab/gi | 匹配所有不区分大小写的 ab |
. | 匹配任意字符 | /.un/ | 匹配 run , gun , fun 等 |
[] | 匹配中括号中的一个字符 | /a[sdf]b/ | 匹配 asb , adb , afb |
- | []中限定一个范围 | /[a-z]/ | 匹配任意小写字母 |
[^] | 不匹配指定的内容 | /[^0-9]ab/ | 不包括数字开头的 ab |
+ | 匹配1个或多个 | /a+/ | 匹配 a , aa , aaa 等 |
* | 匹配0个或多个 | /ab*/ | 匹配 a , ab , abbb 等 |
? | 匹配0个或1个 | /ab?/ | 匹配 a , ab |
.\*? | 惰性匹配(非贪婪) | /<.*?>/ | 匹配 <xxx> 或者 </xxx> 等 |
.\* | 匹配(贪婪) | /<.*>/ | 匹配 <xx>absada</xx> |
^ | 匹配开头 | /^ab/ | 匹配开头是 ab 的字符串:abc |
$ | 匹配结尾 | /ab$/ | 匹配结尾是 ab 的字符串:dab |
\w | 等价于[a-zA-Z0-9_] | /\w/ | 匹配数字、字母、下划线 |
\W | 等价于[^a-zA-Z0-9_] | /\W/ | 匹配非数字、字母、下划线 |
\d | 等价于[0-9] | /\d/ | 匹配数字 |
\D | 等价于[^0-9] | /\D/ | 匹配非数字 |
\s | 等价于[ \r\t\f\n\v] | /\s/ | 匹配空格、换行、tab 等 |
\S | 等价于[^ \r\t\f\n\v] | /\S/ | 匹配非空格、换行、tab等 |
{x,y} | 限定个数 | /a{1,2}/ | 匹配1-2个a |
{x,} | 限定个数 | /a{1,}/ | 匹配1-n个a |
{x} | 限定个数 | /a{1}/ | 匹配1个a |
(?:pattern) | 匹配 pattern但不获取匹配结果 | /a(?:b|c)/ | 等价于`ab |
(?=pattern) | 正向肯定预查 | /a(?=b|c)/ | 匹配ab , ac 中的a |
(?!pattern) | 正向否定预查 | /a(!=b|c)/ | 匹配ad 中的a |
(?<=pattern) | 正向肯定预查 | /(?<=a|b>)c/ | 匹配ac , bc 中的c |
(?<!pattern) | 反向否定预查 | /(?<!a|b>)c/ | 匹配cc , dc 中的c |
基础
正则表达式应当符合实际需求即可,无需过于追求完美。有时候过于追求准确性可能反而破坏实际需求。例如,手机号、邮箱、URL 的正则,很多人试图编写完美的表达式,结果过于严格,反而引发了问题,从而影响了用户的正常使用
使用 RegExp
构造函数的注意点
在将字符串传递给 RegExp
构造函数时,需要注意转义字符。例如,以下是等价的:
js
const re1 = /\w+/
const re2 = new RegExp('\\w+')
// 通过调用 toString() 方法,可以查看正则表达式的字符串表示
re1.toString() // /\w+/
re2.toString() // /\w+/
- 优先使用字面量语法创建正则表达式(更简洁、更易读)
- 需要动态创建正则表达式时,使用
RegExp
构造函数
验证相关
是否是金额(精确到分)
js
const MONEY_PATTERN = /^(0|([1-9]\d*))(\.\d{1,2})?$/
更严格
js
const MONEY_PATTERN =
/(?:^[1-9]([0-9]+)?(?:\.[0-9]{1,2})?$)|(?:^(?:0){1}$)|(?:^[0-9]\.[0-9](?:[0-9])?$)/
是否是手机号
js
const MOBILE_PATTERN = /^1\d{10}$/
js
const MOBILE_PATTERN = /^1[3-9]\d{9}$/
是否是邮箱号
js
const EMAIL_PATTERN = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
更严格的邮箱正则 —— 参考 MDN
js
const EMAIL_PATTERN =
/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
是否是 QQ 号
js
const QQ_NUMBER_PATTERN = /^[1-9]{1}\d{4,11}$/
是否是链接地址
js
const URL_PATTERN =
/^(https|http):\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/
是否是身份证号码
js
const ID_CARD_NUMBER_PATTERN =
/^[1-9]\d{5}(?:18|19|20)\d{2}(?:0[1-9]|10|11|12)(?:0[1-9]|[1-2]\d|30|31)\d{3}[\dXx]$/
是否是 16 进制颜色
js
const HEX_COLOR_PATTERN = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/
Mac地址匹配
regex
^([0-9a-fA-F][0-9a-fA-F]:){5}([0-9a-fA-F][0-9a-fA-F])$
例子: dc:a9:04:77:37:20
格式相关
344 格式手机号
从左到右匹配:
js
const pattern = /(^\d{3}|\d{4}\B)/g
举 🌰
js
'15512341234'.replace(/(^\d{3}|\d{4}\B)/g, '$1 ')
从右到左匹配:
js
const pattern = /\B(?=(\d{4})+\b)/g
举 🌰 :
js
'15512341234'.replace(/\B(?=(\d{4})+\b)/g, ' ')
隐藏手机号中间 4 位
js
const pattern = /(\d{3})\d{4}(\d{4})/
举 🌰 :
js
'15512341234'.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
数字千分位格式化
js
const pattern = /(\d)(?=(\d{3})+\.)/g
举 🌰 :
js
'5201314.1314'.replace(/(\d)(?=(\d{3})+\.)/g, '$1,') // '5,201,314.1314'
保留两位小数:
js
const pattern = /(\d)(?=(\d{3})+\.)/g
举 🌰 :
js
;(5201314.1314).toFixed(2).replace(/\B(?=(\d{3})+\b)/g, ',') // '5,201,314.13'
版本号
regex
^\d+(?:\.\d+){2}$
例子: 0.1.2
。格式必须为 X.Y.Z
。
车牌号
regex
^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z](?:((\d{5}[A-HJK])|([A-HJK][A-HJ-NP-Z0-9][0-9]{4}))|[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳])$
例子: 鄂A34324
, 沪E13359F
。包含新能源车牌。
regex
^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-HJ-NP-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]$
例子: 鄂A34324
, 沪E13595
。不包含新能源车牌。