lRegExp 文档
透明线性时间( E)无后继跟踪) 用于图书馆的正则表达式.
使用量
此套件会导出内置 RegExp 的倒置替换( )说明 (适用).
-
安装
npm install @ericcornelissen/lregexp -
导入
import RegExp from "@ericcornelissen/lregexp"; -
使用
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许可证.