`
kimmking
  • 浏览: 546662 次
  • 性别: Icon_minigender_1
  • 来自: 中华大丈夫学院
社区版块
存档分类
最新评论

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

阅读更多

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

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

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

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

[…]

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

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

索引

指令

操作码/参数

字符串表的引用

描述

0

Lazybranch

23

 

延迟扩展至偏移量为21的Stop指令。

1

 

21

 

2

Setmark

31

 

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

3

Multi

12

 

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

4

 

0

"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

 

0

 

20

 

-1

 

21

Stop

40

 

停止匹配。

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

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

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

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

分享到:
评论

相关推荐

    the Content, History, and Significance of Kolmogorov-Arnold-Moser Theory

    该理论源于20世纪50年代由Andrey Kolmogorov、Vladimir Arnold和Jürgen Moser三位数学家和物理学家的开创性工作。KAM理论不仅对动力系统理论有着深远的影响,还为理解混沌现象、天文力学和量子力学等问题提供了数学...

    量子SU(2 | 1)超对称Calogero-Moser纺丝系统

    特别是,我们提供了量子U(2)自旋Calogero-Moser模型的N = 4 $$ \ mathcal {N} = 4 $超对称,其固有质量参数来自中心扩展的超代数su ^ 2 |。 1 $$ \ widehat {su} \ left(2 \ Big | 1 \ right)$$。 完整系统允许...

    Moq .NET单元测试利器

    Moq是由Dan Moser于2007年创建的一个轻量级的模拟框架,它是基于.NET的动态代理实现的。Moq的名字来源于英文单词“mock”,即模拟对象,它允许我们在测试中创建行为可控的对象,以替代那些依赖于外部系统或不易于...

    超对称多体Euler–Calogero–Moser模型

    我们显式地构建一个具有任意偶数N个超对称性的超对称so(n)spin-Calogero模型。 它具有12Nn(n + 1)而不是Nn的铁离子坐标,并且具有非常简单的机械结构和哈密顿量。 后者与其他守恒电流一起形成osp(N | 2)超代数...

    PyPI 官网下载 | moser-pylint-2.7.0.dev1.tar.gz

    5. 使用:在Python代码中通过`import`语句引入库,如`import moser_pylint`(具体导入方式视库的实现而定)。 总的来说,"moser-pylint-2.7.0.dev1.tar.gz"是一个Python开发者可能会使用的代码质量检查工具,它帮助...

    轨距折纸的量子椭圆Calogero-Moser系统

    我们系统地研究了量子椭圆Calogero-Moser系统(eCM)与它的推广及其相应的超对称规范理论之间的有趣关系。 特别地,我们通过考虑相应量规理论的某些双折瞬时子分配函数来构造适合eCM系统的特征多项式。 这等效于引入...

    C#,墨瑟 德·布鲁因数(Moser de Bruijn)的算法与源代码

    C#,墨瑟 德·布鲁因数(Moser de Bruijn)的算法与源代码,墨瑟 德·布鲁因数(Moser de-Bruijn)序列是将数字4(例如,1、4、16、64等)的不同幂相加得到的序列。 计算公式: 1) S(2 * n) = 4 * S(n) 2) S(2 * n...

    moser:服务于机器学习模型的简单方法

    Moser:模型服务器原型Moser是服务于机器学习模型的简单方法。 Moser的目标是超级轻松地在生产服务器中设置任何类型的预测模型,并能够通过RESTful API调用与其进行交互。产品特点设置模型设定功能开始使用您可以...

    论文研究 - 关于三部分Calogero-Moser问题中分离方程的解

    我们提出了分离变量方程的精确解,该精确解出现在构造具有椭圆两粒子势的量子Calogero-Moser三粒子问题的解的过程中。 对于耦合常数的特殊值,可以找到该解决方案。 它可以用于在适当的边界条件下解决三粒子Calogero...

    trev_305-moser_AAC.rar_aac_theory

    标题中的"trev_305-moser_AAC.rar_aac_theory"暗示我们这里讨论的是关于音频编码技术的AAC(Advanced Audio Coding)理论,特别是其增强版本EAACplus。该压缩包包含了一份名为“trev_305-moser_AAC.pdf”的文档,...

    zuiyouhua.mat

    matlab配套文件https://blog.csdn.net/moser_freshman/article/details/89316644

    二维黑洞微状态的Calogero公式

    通过使用Calogero公式,可以更准确地计算这些微状态数目,进而得到黑洞熵的准确表达式。 在文章内容中提及的“AdS2/CFT1对应关系”是AdS/CFT对应关系中较少被理解的一种情形。AdS2(二维反德西特空间)的对偶CFT1...

    mean-demo:迈克尔·莫泽 (Michael Moser) 的 MEAN 教程

    这个框架允许开发者使用同一种语言——JavaScript,从服务器端到客户端进行全方位的开发,大大提升了开发效率和协同工作的便利性。 1. **MongoDB**:这是一个基于分布式文件存储的开源数据库系统,用于处理大量的...

    网络带宽测试工具

    iperf是由Jeff Moser开发的开源软件,支持多种操作系统,包括Linux、Windows、Mac OS X等。在我们的压缩包中,有两个版本的iperf:`iperf-3.1.2-source.tar.gz`是Linux版本的源代码,而`iperf-3.1.2-win64.zip`是预...

    具一般吸收项的一类拟线性退化抛物方程的局部化条件* (1998年)

    使用Moser迭代技巧和Sobolev嵌入定理,研究了具一般吸收项的一类拟线性退化抛物方程的Cauchy问题解的局部化条件。

    丹佛斯Danfoss变频器在HVAC暖通空调行业应用案例12.pdf

    从技术角度来看,变频器在HVAC系统中主要通过调整电动机的速度来控制流量,从而提供所需的冷却或加热量,这样的调节方式比传统的启停控制方式更为精确和高效。与之相结合的自动谐波滤波器(AHF)则是用来减少变频器在...

    S0002-9947-1987-0882712-7.pdf

    - **Moser的工作**:文中提到了J. Moser在1971年的工作,他证明了任何反对称的并且在某处为正的函数都是二维球面上标量曲率的一个例子。这为Nirenberg问题的研究提供了一个重要的特例。 #### 六、结论 本文通过对...

    发现大脑定位系统的细胞组构.pdf

    获奖者包括英国伦敦大学学院的John O'Keefe教授,以及挪威科技大学的May-Britt Moser和Edvard Moser教授。他们的发现揭示了大脑中定位和导航的关键细胞类型:位置细胞和网格细胞。 位置细胞是O'Keefe教授在1971年...

Global site tag (gtag.js) - Google Analytics