写点什么

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

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

关注

评论

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

5个关键指标评估YashanDB数据库性能表现

数据库砖家

5个决策帮助选择合适的YashanDB数据库配置

数据库砖家

6个理由为什么选择YashanDB数据库

数据库砖家

7个步骤确保YashanDB数据库的顺利迁移

数据库砖家

7个常见问题解答关于YashanDB的误区

数据库砖家

5个理由选择YashanDB用于您的项目

数据库砖家

5个影响YashanDB数据库性能的关键因素

数据库砖家

6个常见误区关于YashanDB的使用与维护

数据库砖家

5个理由使用YashanDB驱动业务增长

数据库砖家

5种方式提升YashanDB的使用体验

数据库砖家

5个关键指标评估YashanDB数据库的表现

数据库砖家

5项指标助您评估YashanDB数据库的性能

数据库砖家

7个步骤更好地维护您的YashanDB环境

数据库砖家

6个常见错误避免在YashanDB数据库管理中出现

数据库砖家

5个关键指标衡量YashanDB的数据库表现

数据库砖家

5个实用建议帮助您快速上手YashanDB

数据库砖家

5个应对YashanDB升级挑战的策略

数据库砖家

5个原因选择YashanDB支持您的企业增长

数据库砖家

5个主要因素影响YashanDB的选择

数据库砖家

5个最常见的YashanDB数据库配置误区

数据库砖家

5个实用的技巧,可以有效提升YashanDB的安全性和隐私

数据库砖家

CST多物理场分析的应用-CST软件达索官方代理

思茂信息

cst CST软件 CST Studio Suite

区块链技术解决跨境交易的核心问题

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

区块链技术 软件外包公司 跨境交易

5个提升YashanDB用户体验的关键建议

数据库砖家

5个有效方法提升YashanDB数据库的安全性

数据库砖家

5种方式提升YashanDB数据库的查询速度

数据库砖家

6种实用的方法提升YashanDB数据库的可用性

数据库砖家

7个步骤轻松掌握YashanDB的使用技巧

数据库砖家

5个关键因素助您成功实施YashanDB数据库

数据库砖家

5个实用技巧优化YashanDB数据库的存储管理

数据库砖家

5个提升YashanDB安全性的重要措施

数据库砖家

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