2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

Jeff Moser 解释.NET 正则表达式的工作方式

  • 2009-04-02
  • 本文字数:1017 字

    阅读完需:约 3 分钟

Jeff Moser 发表了一篇对.NET 中正则表达式工作方式的深入解析。他的文章谈及了微软实现中的一些核心操作原理,如编译正则表达式时使用的机器码。

他首先透露,最近使用的 15 个正则表达式会被缓存起来。对于那些只使用 1 到 2 个正则表达式的小型的应用程序,这意味着没有必要每次都创建一个 Regex 对象。

在编译正则表达式的时候,首先会通过一个扫描器(scanner)来生成(emit)一个 RegexTree。它的叶子节点就好像一种略加扩展的源代码,而下一步便是把它转换为正则表达式引擎所使用的机器码。

这些工作由 EmitFragment 函数完成,其中包含了大约 250 行的 switch 语句。这个函数把 RegexTree 打散成“碎片”再将它们转化为相对简单的 RegexCode

[…]

这些工作生成一个用于描述 RegexCode“操作码”及其参数的整数数组。例如,你可以看到一些例如“ Setrep ”的指令携带了一些字符串参数。这些参数指向了一个字符串表中的偏移量。这就是为什么说,正如我们之前看到的那样,把所有的东西打包成那些不规则字符串是很重要的原因。这是唯一可以传递指令信息的方法。

把代码数组分解之后,我们可以看到:

索引

指令

操作码 / 参数

字符串表的引用

描述

复制代码
[Lazybranch](http://www.koders.com/csharp/fidF4B2B64D471D5B7401063DE2054CB33F28BDA026.aspx#L73)

23

复制代码
延迟扩展至偏移量为 21 的 [Stop](http://www.koders.com/csharp/fidF4B2B64D471D5B7401063DE2054CB33F28BDA026.aspx#L91) 指令。

1

复制代码
21
2

Setmark

31

复制代码
把我们当前的状态放入栈中以便稍后进行回溯。

3

Multi

12

复制代码
对字符串表中的第 0 项(即“http://”)进行一次多字符匹配。

4

复制代码
"http://"

5

Setmark

31

复制代码
把我们当前的状态放入栈中以便稍后进行回溯。

6

Setrep

2

复制代码
对于字符串表中位置为 1 的集合(即\[^\\s/\])进行长度为 1 的反复匹配。

7

复制代码
1

“\x1\x2\x1\x2F\x30\x64”

8

复制代码
1
9

Setloop

5

复制代码
在最多为 Int32.MaxValue 次的循环中对\[^\\s/\] 集合进行匹配。

10

复制代码
1

“\x1\x2\x1\x2F\x30\x64”

11

复制代码
2147483647
12

Capturemark

32

复制代码
捕获组#1,即最近一次 Setmark 所标记的位置,到当前位置的字符串。

13

复制代码
1
14
-1
15

Oneloop

3

复制代码
在最多为 1 次的循环中匹配 Unicode 字符 47

16

复制代码
47
17
1
18

Capturemark

32

复制代码
捕获组#0,即第一次 Setmark 所标记的位置,到当前位置的字符串。

19

复制代码
20
-1
21

Stop

40

复制代码
停止匹配。

可以看到,正则表达式已经被转化为一个稍后可供运行的简单“程序”。

Jeff Moser 的博客中描述了有关这个过程的更多信息。他的文章还讨论了:

  • 前缀优化
  • 解释器
  • 回溯
  • 已知错误

查看英文原文: Jeff Moser’s How .NET Regular Expressions Really Work

2009-04-02 21:081908
用户头像

发布了 157 篇内容, 共 62.3 次阅读, 收获喜欢 6 次。

关注

评论

发布
暂无评论
发现更多内容

软件测试/测试开发|一文带你了解Python列表操作

霍格沃兹测试开发学社

开启安全功能 ES 集群就安全了吗?

极限实验室

console 集群

干货|EasyMR 基于 Kubernetes 应用的监控实践

袋鼠云数栈

大数据 Kubernetes 云原生 可观测性 Promtheus

自主研发国产堡垒机,助力企业信息安全可控

行云管家

网络安全 信息安全 堡垒机

京东店铺所有商品数据接口(JD.item_search_shop)丨京东API接口

tbapi

京东API接口 京东商品数据接口 京东店铺所有商品数据接口 京东店铺数据接口

DAPP算力挖矿系统开发丨详情开发

l8l259l3365

Databend 开源周报第 126 期

Databend

Data

软件测试训练营|从原理到实战,四天带你轻松进阶Python

霍格沃兹测试开发学社

实时数仓投放主备链路Diff测试工具落地实践

得物技术

AI 数据

玩转数据世界:跨工作空间的安全授权与高效查询

观测云

数据可视化 数据授权

逻辑回归算法是什么呢?

小齐写代码

DDD落地实践-架构师眼中的餐厅 | 京东云技术团队

京东科技开发者

京东商品列表数据接口(JD.item_search)丨京东API接口

tbapi

京东API接口 京东商品数据接口 京东商品列表数据接口 关键词搜索京东商品接口 京东商品API接口

大数据平台Bug Bash大扫除最佳实践

京东科技开发者

用友BIP全球司库助力陕西建工控股集团打造世界一流司库体系

用友BIP

全球司库

报名启动|OpenHarmony源码转换器—多线程特性转换赛题

OpenHarmony开发者

OpenHarmony

面向Java应用网络流的非侵入可观测指标采集联合方案 – Sermant & Gopher

华为云开源

微服务 Java、 sermant

软件测试/测试开发丨Python 列表

测试人

软件测试 测试开发

【介绍篇】Supabase与Firebase的关系和区别

张文平

数据库 云服务 Baas Supabase firebase

用友ICT行业供应链数智化解决方案

用友BIP

供应链 ICT 行业

【鸿蒙千帆起】《开心消消乐》完成鸿蒙原生应用开发,创新多端联动用户体验

HarmonyOS开发者

HarmonyOS

CloudQuery的过去、现在和未来

BinTools图尔兹

CloudQuery

开源协助平台工程灵活应对多云时代的挑战

SEAL安全

开源 运维 平台工程

基于扁平化BOM的全业务应用领先实践,提升离散制造行业运营效率

用友BIP

智能制造

【原理篇】Supabase应用开发为什么要配置RLS

张文平

权限 PgSQL Supabase 访问权限 Postgrest

Jeff Moser解释.NET正则表达式的工作方式_.NET_Jonathan Allen_InfoQ精选文章