写点什么

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:081702
用户头像

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

关注

评论

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

【HarmonyOS】关于鸿蒙原生项目多环境的配置和管理

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT 实践分享

人效评估管理系统(源码+文档+讲解+演示)

深圳亥时科技

原生APP开发的优势

北京木奇移动技术有限公司

APP开发 软件外包公司 APP开发公司

狄耐克脑电波交互事业部参访厦门大学实验室,共探脑科学前沿应用

新消费日报

【HarmonyOS Next】鸿蒙应用弹框和提示气泡详解(一)

GeorgeGcs

ios android 鸿蒙 HarmonyOS OpenHarmony

“团队敏捷教练进阶课程” 6月28-29日 · A-CSM认证周末班

ShineScrum

华大北斗芯耀纽伦堡嵌入式展EW2025

江湖老铁

【HarmonyOS】鸿蒙原生分享之“碰一碰”分享(APP内实现)

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT 实践分享

APP的开发方式及特点

北京木奇移动技术有限公司

APP开发 软件外包公司 APP开发公司

源于代码而不止于代码

FunTester

计算机就业看过来,16家宝藏外企分享

王中阳Go

计算机 就业 外企

【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解

GeorgeGcs

鸿蒙 HarmonyOS NEXT HAP HSP HAR

原生APP开发的成本

北京木奇移动技术有限公司

APP开发 软件外包公司 APP外包公司

英伟达黄仁勋GTC演讲,算力和数据等基础设施驱动AI蓬勃发展

PowerVerse

算力 AGI DePIN GTC2025

【HarmonyOS】鸿蒙原生实现3DTouch快捷方式

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT 实践分享

“全球金牌课程”5月17-18日·上海线下·CSM认证【提前报名特惠】CST导师亲授

ShineScrum

敏捷 CSM认证 CSM认证培训

Intel 18A双引擎:RibbonFET搭配PowerVia如何提升芯片性能

E科讯

【HarmonyOS】鸿蒙原生实现应用间跳转之Deep Linking

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT

2025企业财务数智化峰会·湖南站,在长沙成功举办!

用友智能财务

AI 财务 数智化 会计

基于 pyflink 的算法工作流设计和改造

Apache Flink

大数据 flink 实时计算

「DeepSeek-V3 技术解析」:DeepSeekMoE

Baihai IDP

程序员 AI LLMs MoE DeepSeek-V3

产品溯源管理系统(源码+文档+讲解+演示)

深圳亥时科技

混合APP开发的特点

北京木奇移动技术有限公司

APP开发 软件外包公司 APP外包公司

【HarmonyOS】关于鸿蒙原生使用原生相机实现扫一扫功能

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT 实践分享

BOE(京东方)携手京东发起百吋电视品牌联盟发布会 引领家庭视听正式迈入大屏时代

科技热闻

如何用大模型评估大模型——PAI-Judge裁判员大语言模型的实现简介

阿里云大数据AI技术

人工智能 大模型 LLM PAI 模型评测

鸿蒙相机开发实战:从设备适配到性能调优 —— 我的 ArkTS 录像功能落地手记(API 15)

李游Leo

HarmonyOS

4 大开源产品帮你避免闭源低代码平台的隐藏成本

NocoBase

开源 低代码 零代码 开发工具 隐藏成本

AI数字人的测试

北京木奇移动技术有限公司

AI智能体 软件外包公司 AI数字人

【HarmonyOS】鸿蒙原生实现应用间跳转之App Linking

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT 实践分享

【HarmonyOS】关于鸿蒙原生实现红包雨效果的方案设计

走向菜鸟的菜鸟

鸿蒙 HarmonyOS ArkTS HarmonyOS NEXT 实践分享

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