@ericcornelissen/lregexp

中文文档
1.0.13发布于 2026/06/20MITTypeScriptESM + CJS零依赖构建来源已验证近 30 天下载 1.1万

用于库的透明线性时间(非回溯跟踪)正则表达式

中文使用文档
文档目录9 节
  1. 使用量
  2. 运行时间
  3. 背景情况
  4. 为什么
  5. 洞穴
  6. 示例
  7. 重写
  8. 测试
  9. 许可证

lRegExp 文档

透明线性时间( E)无后继跟踪) 用于图书馆的正则表达式.

使用量

此套件会导出内置 RegExp 的倒置替换( )说明 (适用).

  1. 安装

    npm install @ericcornelissen/lregexp
    
  2. 导入

    import RegExp from "@ericcornelissen/lregexp";
    
  3. 使用

    new RegExp("[linear]{6}");
    

运行时间

这个软件包与Node.js,Deno,Bun等主要浏览器兼容. 只有这样 在基于 V8 的运行时间( Node.js, Deno, Chromium 的浏览器)中生效 启用了实验线性时间引擎。 否则就掉回原地 默认 RegExp 建筑师.

要启用线性时间正则表达式引擎:

  • 节点.js: 使用 node --enable-experimental-regexp-engine entrypoint.js
  • 德诺: 使用 DENO_V8_FLAGS="--enable-experimental-regexp-engine" deno entrypoint.ts

背景情况

为什么

后跟踪正则表达式需要指数化时间进行评估,从而引导 以敬畏者发誓 ReDos 软件 脆弱性。 线性时间正则表达式避免此现象 由不回溯跟踪.

在基于 V8 的运行时,线性时正则表达式可以使用 l 旗帜提供了 --enable-experimental-regexp-engine 使用了 CLI 选项 . 这使得图书馆作者难以利用. 使用此软件包, a 库可以照常使用 RegExp 构建器并从线性时间中受益 用户启用时的正则表达式引擎。 如果他们不这样做, 它优雅地 返回默认构造器.

洞穴

并非所有有效的 JavaScript 正则表达式在使用时都被支持 --enable-experimental-regexp-engine CLI选项. 这个包裹不会告诉你 您的正则表达式不兼容, 除非你用 CLI 运行它 选项。 如果正则表达式不兼容,则构造器将丢入 语法错误。 。 。 .

为了支持这个软件包的用户 写作兼容的正则表达式,我们是 有兴趣:

  • 一个 ESLint 插件, 用于插入正则表达式并提醒使用 regex 特性不由非后跟踪引擎支持; (4号(中文(简体) )
  • 用于检查给定正则表达式的工具( CLI/ web) 与 非回转引擎。 (21号(中文(简体) )

示例

ReDoS- vulnerable正则表达式的一个经典例子是 (a*)*b。使用 与香草节点.js 在病理输入字符串上需要相当长的时间, 为你自己测试(添加一个) a 和运行时间的加倍:

node -e '/(a*)*b/.test("aaaaaaaaaaaaaaaaaaaaaaaaac")'

当非回溯正则表达式引擎启用时,表达式 即时评估 :

node -e '/(a*)*b/l.test("aaaaaaaaaaaaaaaaaaaaaaaaac")' --enable-experimental-regexp-engine

重写

以下是一些关于改写正则表达式的建议: JavaScript的标准引擎到线性时间引擎. 这些建议是: 尚需进行不普遍适用的仔细试验.

  • 正视前 (O)(?=...)当 替换

    抓取外观并恢复(使用) $<n>在替换时。 对于 示例: replace(/(a(?=b)/, "A") 改为 replace(/a(b)/, "A$1")。 。 。 .

  • 负望前 ((?!...)当 替换

    抓取外观前方,倒置相配,再加一串后方主播($, (中文(简体) ), 并恢复(使用 $<n>在替换时。 例如: replace(/(a(?!b)/, "A") 改为 replace(/a([^b]|$)/, "A$1")。 。 。 .

  • i 旗帜时 测试

    写入正则表达式以匹配小写字符串并将字符串转换为 小写( 使用 .toLowerCase()在匹配它们之前.

测试

我们建议使用 差异测试 使用 快速检查 重写时 常规表达式。 您可以使用以下测试示例作为模板:

// Run as: node --test --enable-experimental-regexp-engine rewrite_test.js

import { test } from "node:test";

import lRegExp from "@ericcornelissen/lregexp";
import * as fc from "fast-check";

test("rewritten regular expression", () => {
  const original = /old regular expression/;
  const rewritten = new lRegExp(/new regular expression/);

  fc.assert(
    fc.property(
      fc.oneof(
        // any old string, unlikely to match
        fc.string(), 

        // strings that should match (limited support)
        fc.stringMatching(original), 
      ),
      (s) => original.test(s) === rewritten.test(s)
    ),
  );
});

test("--enable-experimental-regexp-engine", () => {
  /ensures that the linear engine is enabled/l;
});

许可证

源代码根据麻省理工学院的许可,参见 自由主义 全文 许可证文本。 文件文本根据 CC0-1.0 许可; 代码片段 根据MIT -0许可证.

版本与发布记录

@ericcornelissen/lregexp 共发布 14 个版本,首次发布于 2025/08/19;过去 12 个月发布了 11 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
1.0.13latest2026/06/204 个月前
1.0.122026/06/184 个月前
1.0.112026/06/144 个月前
1.0.102026/06/045 个月前
1.0.92026/05/066 个月前
1.0.82026/03/048 个月前

关于 @ericcornelissen/lregexp 的常见问题

@ericcornelissen/lregexp 是什么?

用于库的透明线性时间(非回溯跟踪)正则表达式

如何安装 @ericcornelissen/lregexp?

在项目目录运行 npm install @ericcornelissen/lregexp,或使用 pnpm add / yarn add / bun add。

@ericcornelissen/lregexp 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@ericcornelissen/lregexp 支持 ESM 还是 CommonJS?

同时提供 ES Module 与 CommonJS 入口,import 和 require() 都可以使用,打包工具会自动选择合适的版本。

@ericcornelissen/lregexp 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js ^0.8.6 || >=0.9.1 <27。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@ericcornelissen/lregexp 可以商用吗?

@ericcornelissen/lregexp 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@ericcornelissen/lregexp 的下载量有多少?

根据 npm 官方下载统计,@ericcornelissen/lregexp 在 2026/10/14 – 2026/11/12 这 30 天内被下载 10,602 次,日均约 353 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@ericcornelissen/lregexp 还在维护吗?

最新版本 1.0.13 发布于 2026/06/20(4 个月前);至今共发布 14 个版本,其中过去 12 个月发布了 11 个;首次发布于 2025/08/19。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。