写点什么

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

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

关注

评论

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

SynVision AI: 虚拟助手的革命

Synvision.AI

人工智能 AI 智能助手 问答助手 聊天助手

Wireshark网络工具是什么?

小魏写代码

Keyboard Maestro for mac(苹果键盘热键软件) v11.0.1完美激活版

mac

苹果mac Windows软件 Keyboard Maestro 键盘快捷键工具

BetterDisplay Pro for Mac(显示器校准软件)

展初云

Mac软件 BetterDisplay

向量数据库——AI时代的基座

陈老老老板

#人工智能

Xmind for Mac(思维导图软件) 24.01中文版

加油,小妞!

思维导图 mac软件下载

无服务器开发实例|微服务向无服务器架构演进的探索

亚马逊云科技 (Amazon Web Services)

Serverless 微服务 API Amazon Lambda Amazon API Gateway

BetterDisplay Pro for Mac v2.0.11激活版

加油,小妞!

BetterDisplay Pro 显示器校准工具

达达埋点迁移京东子午线实践 | 京东云技术团队

京东科技开发者

埋点设计 企业号11月PK榜 埋点迁移 架构迁移

关注潜在的整数越界问题 | 京东物流技术团队

京东科技开发者

spring 企业号11月PK榜 整数越界

PullTube for Mac(在线视频下载工具)

展初云

视频下载 Mac软件

在你购买小间距led显示屏时需要注意这些事项

Dylan

LED显示屏 全彩LED显示屏 led显示屏厂家 户内led显示屏

Mac电脑视频剪辑Final Cut Pro激活版中文最新

胖墩儿不胖y

Mac软件 视频处理工具 视频剪辑软件 视频编辑器

AWS向量数据库Amazon OpenSearch Service使用测评

查拉图斯特拉说

亚马逊云科技 向量数据库 opensearch service

现身说法:2023中级程序员进阶之路

伤感汤姆布利柏

程序员 程序员成长

Mac电脑屏幕录像推荐:Iris激活最新版

mac大玩家j

屏幕录制 录屏软件 Mac软件

Microsoft Remote Desktop for Mac 远程桌面连接工具

彩云

远程桌面连接 microsoft remote desktop

Amazon EC2 新手初探:更多实例连接方式

王强

Amazon EC2 亚马逊云服务

使用1688开放平台API接口获取商品详情信息

Noah

解锁未来:通过数字孪生和区块链进行物联网管理

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

CSS 新特性,建议收藏!

秃头小帅oi

CSS 前端

Parallels Desktop 18 虚拟机 支持M1

彩云

虚拟机 Parallels Desktop 18

高效开发与设计:提效Spring应用的运行效率和生产力 | 京东云技术团队

京东科技开发者

spring 性能优化 SpringBoot启动流程 企业号11月PK榜

一文看懂:5分钟玩转容器云,彻底化解业务上云烦恼

统信软件

Amazon EC2 新手初探:操作我们的实例

王强

Amazon EC2 亚马逊云服务器

🔥🔥Java开发者的Python快速进修指南:控制之if-else和循环技巧

EquatorCoco

Java 编程语言 项目开发

Navicat 基于 GaussDB 主备版的快速入门

华为云开发者联盟

数据库 后端 华为云 华为云GaussDB 华为云开发者联盟

ON1 Photo RAW 2024 for Mac(RAW照片编辑软件)

展初云

Mac 照片编辑软件

使用 VuePress 和 Vercel 打造个人技术博客:实现自动化部署

小白Coding日志

GitHub 个人博客 自动部署 Vuepress2.X Vercel

NFTScan | 11.13~11.19 NFT 市场热点汇总

NFT Research

NFT\ NFTScan nft工具

AWS云服务器EC2实例实现ByConity快速部署

乌龟哥哥

AWS

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