Skip to content

常用正则

说明

记录开发中常用的一些正则表达式,建议在使用时根据具体业务需求进行调整。

注意

由于代码格式化工具可能会在行首添加分号,以下示例均采用变量赋值的形式展示。

基础知识

正则表达式应当服务于实际需求,不必过分追求"完美"。有时过于复杂的正则反而会降低代码的可读性和维护性,甚至因为过于严格的校验而影响用户体验(例如过于严格的手机号或邮箱校验)。

RegExp 构造函数

当使用 RegExp 构造函数创建正则时,需要特别注意字符转义。

javascript
// 字面量方式(推荐:更简洁、性能更好)
const regexLiteral = /\w+/

// 构造函数方式(适用于需要动态构建正则的场景)
const regexConstructor = new RegExp('\\w+')

console.log(regexLiteral.toString()) // /\w+/
console.log(regexConstructor.toString()) // /\w+/

常用验证

金额(精确到分)

javascript
// 基础校验
const patternMoney = /^(0|([1-9]\d*))(\.\d{1,2})?$/

// 更严格的校验(排除 00、01 等非法格式)
const patternMoneyStrict =
  /(?:^[1-9]([0-9]+)?(?:\.[0-9]{1,2})?$)|(?:^(?:0){1}$)|(?:^[0-9]\.[0-9](?:[0-9])?$)/

手机号

javascript
// 宽松匹配(只要是 1 开头,11 位数字)
const patternMobile = /^1\d{10}$/

// 严谨匹配(根据号段规则)
const patternMobileStrict = /^1[3-9]\d{9}$/

邮箱

javascript
// 基础匹配
const patternEmail = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/

// 严谨匹配(参考 MDN 标准)
const patternEmailStrict =
  /^[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 号

javascript
// 5-11 位数字,首位不为 0
const patternQQ = /^[1-9]\d{4,10}$/

URL 链接

javascript
const patternUrl =
  /^(https|http):\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/

身份证号码

javascript
// 18 位身份证校验
const patternIdCard =
  /^[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 进制颜色

javascript
const patternHexColor = /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/

格式化处理

手机号 3-4-4 格式

从左到右匹配:

javascript
const formatMobileLeft = /(^\d{3}|\d{4}\B)/g

// 示例
'15912345678'.replace(formatMobileLeft, '$1 ')
// 输出: "159 1234 5678"

从右到左匹配:

javascript
const formatMobileRight = /\B(?=(\d{4})+\b)/g

// 示例
'15912345678'.replace(formatMobileRight, ' ')
// 输出: "159 1234 5678"

手机号脱敏

隐藏手机号中间 4 位数字。

javascript
const hideMobileMiddle = /(\d{3})\d{4}(\d{4})/

// 示例
'15912345678'.replace(hideMobileMiddle, '$1****$2')
// 输出: "159****5678"

数字千分位

javascript
// 1. 纯整数匹配
const formatInt = /\B(?=(\d{3})+$)/g

// 2. 含小数匹配
const formatFloat = /\B(?=(\d{3})+\.)/g

// 3. 单词边界匹配(通用性更强)
const formatGeneral = /\B(?=(\d{3})+\b)/g

使用示例:

javascript
// 整数
'12345678'.replace(formatInt, ',')
// "12,345,678"

// 小数
'12345678.99'
  .replace(
    formatFloat,
    ',',
  )(
    // "12,345,678.99"

    // 金额保留两位小数并格式化
    12345678.99,
  )
  .toFixed(2)
  .replace(formatGeneral, ',')
// "12,345,678.99"

如有转载或 CV 的请标注本站原文地址