标签 RegExp 下的文章

著名的类型安全语法运行时验证库ArkType推出了ArkRegex,这是 JavaScript RegExp 构造函数的即插即用替代方案,为正则表达式带来了完整的类型推断功能。

ArkRegex 在不增加任何运行时开销的情况下为正则表达式引入了类型安全性,内置支持所有原生 RegExp 的功能,包括位置和命名捕获组、标志以及类型级别的模式验证。

该库解决了 TypeScript 开发中一个长期存在的痛点,那就是基于字符串构建的正则表达式在运行时之前无法提供任何类型安全性。ArkRegex 能够直接从正则表达式模式推断出字符串类型,将引用不存在的组等语法错误作为类型错误进行捕获,避免运行时故障。

ArkRegex 的语法与原生 RegExp 构造函数一致,这使其应用过程非常简单。文档中包含的一个示例展示了简单模式的类型推断:

const ok = regex("^ok$", "i")// Regex<"ok" | "oK" | "Ok" | "OK", { flags: "i" }>
复制代码

对于处理捕获组的开发者,ArkRegex 为位置和命名捕获提供了自动的类型定义。

命名捕获组也得到了类似的处理,该库为模式中每个命名组推断出精确的类型。这一功能对生产应用中常见的电子邮件验证和 URL 解析模式尤其有益。

该版本在 TypeScript 5.9 或更高版本下表现最佳,它利用了 TypeScript 类型推断引擎的最新改进。要安装该库,只需要运行 pnpm install arkregex 或其他包管理器的等效命令即可。

ArkRegex 加入了既有的 TypeScript 正则表达式生态系统,特别是采用了自然语言语法并编译为纯 RegExp 的magic-regexp。magic-regexp 侧重于通过其构建器模式提高可读性,而 ArkRegex 则通过保持标准正则表达式语法的同时添加类型推断来优先考虑熟悉度。习惯传统正则表达式的开发者可能会发现 ArkRegex 的学习曲线更平缓,而偏好显式 API 的开发者可能更喜欢 magic-regexp 的方法。

该库在 TypeScript 社区中获得了积极的反响。John De Goes remarked在回应该公告时评论说:“简直不可思议(是褒义的)”。

Reddit的TypeScript社区中,该项目获得了大量赞誉,一位评论者对作者的实现所需复杂性的能力表达了信任:

很明显,人们可以在类型级别做到这一点。但是,考虑到这需要支持无数边缘情况和功能,我会尝试吗?绝对不会。但知道了它是谁实现的,我 100%相信这能按预期运行……

对于超出 TypeScript 类型推断限制的复杂表达式,ArkRegex 提供了 regex.as 逃生出口,允许手动类型注解:

const complexPattern = [regex.as](<http://regex.as>)<`pattern-${string}`, {captures: [string]}> ("very-long-complex-expression-here")
复制代码

该项目使用了 ArkType 的测试框架attest进行了功能测试和基准测试。测试套件涵盖了 ECMAScript 规范支持的正则表达式语法中的边缘情况。

 

由于 ArkRegex 是 ArkType 项目的一部分,而不是独立的版本化包,迁移的问题主要适用于首次采用该工具的开发者。该库不需要更改现有的正则表达式模式,可直接替换RegExp()调用。ArkType Visual Studio Code扩展为 regex 调用添加了语法高亮,改善了开发体验。

 

ArkType 是一个开源的运行时验证库,它从类型安全语法中解析出优化的验证器。该项目将 TypeScript 的类型系统扩展到运行时验证,使开发者能够定义在编译时和运行时都适用的模式。

原文链接:

ArkType Introduces ArkRegex with Type Safe Regular Expressions

下面给你一份企业级、可落地、讲透原理的 JS 正则方法使用指南。不绕弯子,直击你在真实业务里一定会用到的点


一、一句话先定性 🧠

JavaScript 正则表达式(RegExp),本质是一个
👉 用于“字符串规则匹配、校验、提取、替换”的高性能工具

在实际项目中,它主要承担四类职责:

  • 数据校验
  • 🔍 内容匹配
  • ✂️ 字符串提取
  • 🔄 批量替换

二、JS 正则的两种创建方式(必须分清)⚙️

方式一:字面量方式(最常用)

const reg = /^\d{11}$/;

解释:

  • /.../:正则字面量写法
  • ^:字符串开始
  • \d{11}11 位数字
  • $:字符串结束

👉 表达含义: <span style="color:red">只能是完整的 11 位数字</span>


方式二:构造函数方式(动态规则必用)

const reg = new RegExp("^\\d{11}$");

解释:

  • 用在 规则需要拼接变量 的场景
  • 反斜杠需要 双写转义

👉 适合: <span style="color:red">动态生成正则规则</span>


三、JS 中最核心的 5 个正则方法(重点)🚀

方法一:test() —— 校验是否匹配

const reg = /^\d{11}$/;
reg.test("13800138000");

解释:

  • 返回 true / false
  • 不关心匹配内容,只关心“对不对”

👉 典型用途: <span style="color:red">表单校验、参数校验、接口校验</span> ✅


方法二:match() —— 提取匹配结果

const str = "订单号:NO20260123";
const res = str.match(/\d+/);

解释:

  • 返回一个数组
  • 第一个元素是匹配到的内容

👉 常用于: <span style="color:red">日志分析、内容解析</span>


方法三:exec() —— 精准控制提取(高级)

const reg = /\d+/g;
reg.exec("id=100&type=200");

解释:

  • 返回单次匹配结果
  • 配合 g 标志可逐条提取
  • 适合做循环解析

👉 企业级用法多见于: <span style="color:red">日志流水、规则扫描</span>


方法四:replace() —— 替换内容(非常重要)

const str = "手机号:13800138000";
const res = str.replace(/\d{11}/, "***********");

解释:

  • 第一个参数:正则
  • 第二个参数:替换值
  • 不会修改原字符串

👉 常见用途: <span style="color:red">数据脱敏、文本清洗</span> 🔒


方法五:split() —— 按规则切割

const str = "a,b;c|d";
str.split(/[,;|]/);

解释:

  • 用正则作为分隔符
  • 比普通 split(",") 强大得多

👉 场景: <span style="color:red">配置解析、多格式数据拆分</span>


四、正则修饰符(必须吃透)🧩

修饰符含义实际价值
g全局匹配<span style="color:red">多次匹配</span>
i忽略大小写用户输入友好
m多行模式日志/文本处理

示例:

/abc/gi

👉 表示: <span style="color:red">全局 + 忽略大小写</span>


五、常用正则规则速查表(企业实战)📊

场景正则
手机号/^1\d{10}$/
纯数字/^\d+$/
邮箱/^[\w.-]+@[\w.-]+\.\w+$/
中文/^[\u4e00-\u9fa5]+$/
IP 地址`/^(25[0-5]2[0-4]\d[01]?\d\d?)./`

👉 这些规则 直接可用,无幻想成分


六、正则执行原理(通俗版)🔍

字符串输入
   ↓
正则引擎逐字符扫描
   ↓
匹配失败 → 回溯
   ↓
匹配成功 → 返回结果

⚠️ 注意:

  • 正则写不好,会产生 回溯性能问题
  • 在高并发环境下尤为明显

👉 企业实践建议: <span style="color:red">规则越明确越好,避免贪婪匹配</span>


七、常见误区(必须避坑)⚠️

  • ❌ 用正则解析复杂 HTML
  • ❌ 一个正则解决所有问题
  • ❌ 不加 ^ $ 做完整校验
  • ❌ 高并发场景写复杂回溯规则

实话实说
正则是手术刀,不是大锤


八、总结(给决策者的结论)✅

  • JS 正则不是技巧,是基本功
  • 校验、解析、脱敏、清洗,离不开它
  • 写得好,是效率工具;写不好,是性能隐患

👉 真正专业的前后端工程师,
正则一定是“随手就能写对”的能力

如果你下一步想要:
「正则 + 表单安全 / 接口参数校验 / 高并发性能优化」
我可以直接给你一套 企业级实战模板