JavaScript 引擎轨迹 · 明示 regex 方言
一次匹配,不只有“命中”或“没命中”。
正则表达式并不存在跨语言通用的唯一语义。这里遵循当前浏览器的 ECMAScript RegExp 行为,把 flags、匹配范围、捕获组、索引和替换结果作为可核对的执行证据。
JS
ONLY
PATTERN
/(?<proto>https?):\/\/(?<host>[^/:\s]+)(?::(?<port>\d+))?(?:\/[^?\s]*)?(?<query>\?[^\s]*)?/dguINPUTVisit https://example.com:8080/docs next.0V
1i
2s
3i
4t
5·
6h
7t
8t
9p
10s
11:
12/
13/
14e
15x
16a
17m
18p
19l
20e
21.
22c
23o
24m
25:
268
270
288
290
30/
31d
32o
33c
34s
匹配 0 · [6, 35)proto · [6, 11)host · [14, 25)port · [26, 30)
Flag 状态机
Flags 改变语义和迭代方式,不是装饰。
d
匹配索引
为完整匹配和捕获组提供起止范围
g
全局匹配
持续迭代并改变 lastIndex
i
忽略大小写
采用当前引擎的大小写折叠规则
m
多行模式
^ 和 $ 也识别行边界
s
DotAll
. 可以匹配行终止符
u
Unicode
按码点解析字符和转义
v
Unicode 集合
支持集合运算与字符串属性
y
粘连匹配
必须从 lastIndex 指定的位置开始命中
捕获组账本
未参与匹配,不等于匹配了空字符串。
0 · 完整匹配[6, 35)https://example.com:8080/docsparticipated1 · proto[6, 11)httpsparticipated2 · host[14, 25)example.comparticipated3 · port[26, 30)8080participated4 · query(可选)—undefinedunmatched原生替换验证
replacement template 也有自己的语法。
ORIGINAL
Visit https://example.com:8080/docs next.TEMPLATE
$<proto>://$<host>RESULT
Visit https://example.com next.$& · 完整匹配$1 … $99 · 编号捕获组$<name> · 命名捕获组$$ · 美元符号字面量$` / $' · 匹配前缀 / 后缀
回溯隔离舱
页面仍能响应,不代表正则适合生产环境。
/^(a+)+$/aaaaaaaaaaaaaaaaaaaaaaaaaaaa!每次执行都使用独立 Worker;开始新任务会终止上一个 Worker,正的超时设置会被限制在 50–10,000 ms 并在到期后终止任务。它能保护当前页面交互,却无法证明该模式在其他引擎、真实输入分布和服务端资源策略下不会触发 ReDoS。