`
gk23
  • 浏览: 177033 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)正则表达式解释器实现原理

阅读更多

转自:http://blog.csdn.net/qipnx/archive/2007/10/22/1836596.aspx

正则表达式可以用来:

1)验证字符串是否符合指定特征,比如验证是否是合法的邮件地址。

2)用来查找字符串,从一个长的文本中查找符合指定特征的字符串,比查找固定字符串更加灵活方便。

3)用来替换,比普通的替换更强大。

对于一个正则表达式一般有2种方式,以JS为例

其一为使用正则表达式文字常量:

var re = /^[Jj]ava[Ss]cript/i;

其二为使用RegExp构造函数:

var re = new RegExp(“^[Jj]ava[Ss]cript”,”i”);

 

而一个正则表达式解释器主要有3部分组成,分别是解析(parse)、编译(compile)与执行(execute)。

 

1 解析

正则的表达式的词法与语法比较简单,基本语法如下:

A普通字符和元字符

普通字符是那些表示自身的字符,例如从azAZ09等;

元字符具有特殊意义,如‘.’,表示除了‘\n’外的所有字符,其他具有此功能的有

 

1 元字符

元字符

特殊意义

^

匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"

$

匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$"

.

匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."

*

修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*"

+

修饰匹配次数为至少 1 次。要匹配“+” 字符本身,请使用 “\+”

?

修饰匹配次数为 0 次或 1 次。要匹配 “?” 字符本身,请使用 “\?”

=

用于前向引用或向后引用

!

用于前向引用或向后引用

:

用于前向引用或向后引用

|

用于前向引用或向后引用

\

转义用

/

用于前向引用或向后引用

()

标记一个子表达式的开始和结束位置。要匹配小括号,请使用 “\(“  “\)”

[]

用来自定义能够匹配 多种字符 的表达式。要匹配中括号,请使用“\[“  “\]”

{}

修饰匹配次数的符号。要匹配大括号,请使用 “\{“  “\}”

元数据如要表示自身,那么需要用’\’来辅助转义

 

B)字符类

单个的字符可以组成字符类,其语法为用’[’’]’组成,例如[abcA-Z79]表示可以匹配abcAZ79的字符

其中’-’为连字符,表示字符的跨度。

‘^’”[]”间也是特殊字符,表示取反

其他的特殊字符如下表:

2 字符类中的预定义字符类

预定义字符类

特殊意义

^

在紧跟’[’表示取反,表示自身要转义

-

在字符间,表示连字符,如要表示自身,须紧接在’[’’[^’之后

.

小数点可以匹配除了换行符(\n)以外的任意一个字符

\d

可以匹配任何一个 0~9 数字字符

\D

D大写,可以匹配任何一个非数字字符

\s

可以匹配空格、制表符、换页符等空白字符的其中任意一个

\S

S大写,可以匹配任何一个空白字符以外的字符

\w

可以匹配任何一个字母或者数字或者下划线

\W

W大写,可以匹配任何一个字母或者数字或者下划线以外的字符

JavaScriptPOSIX格式

C)限定符(重复)

限定符有2种形式,分别为’*’,’+’,’?’’ {’’}’来表示

3 限定符

限定符

特殊意义

*

表达式尽可能的多匹配,最少可以不匹配,相当于 {0, }

+

表达式尽可能的多匹配,至少匹配1次,相当于 {1, }

?

表达式尽可能匹配1次,也可以不匹配,相当于 {0, 1}

{m,n}

表达式尽可能重复n次,至少重复m次:"ba{1,3}"可以匹配 "ba""baa""baaa"

{m}

表达式固定重m次,比如:"\w{2}" 相当于 "\w\w"

{m,}

表达式尽可能的多匹配,至少重复m次:"\w\d{2,}"可以匹配 "a12","x456"...

 

在正则中有贪婪与非贪婪之分,默认的情况下,正则是贪婪的

如果要把正则设置为非贪婪有2种方式,一种为设置在原先的限定符加上’?’就行,另一种在设置

举例说明,/.+/ 将匹配"abdddd"中的所有字符,/.+?/ 只将匹配"abdddd"中的第一个a,也就是默认的尽可能多的匹配字符,而非贪婪重复则尽可能上的匹配。

 

D选择、分组和引用

选择的语法就是设置’|’,如a|bc,那么要么abc都可以匹配,如果(a|b)c则为匹配acbc

如果我们在上例中设置了”()”,那么这就是分组,每个分组都可以被引用,如(a|b)c*(e|f)\1\2\1\2就是引用的语法,\1表示引用了(a|b)\2表示引用(e|f),以此类推。

这里要说明的是(a|b)c*(e|f)\1\2(a|b)c*(e|f)(a|b)(e|f)乍一看两者等同,但实际上,前一个不可以匹配acebf,而后一个可以。究其原因就是引用处的配平必须与被引用处一致,此例中与之匹配的可以是aceac

 

E定位符()和前向引用

定位符如下表所示

4 定位符

限定符

特殊意义

^

匹配输入字符串的开始位置。要匹配 "^" 字符本身

$

匹配输入字符串的结尾位置。要匹配 "$" 字符本身

?

表达式尽可能匹配1次,也可以不匹配,相当于 {0, 1}

\b

匹配单词边界,例如一个\w\W的位置,或者一个\w与字符串的开始和结尾的位置

\B

和上面的想法,匹配一个非单词边界

如果正则表达式的匹配模式为 MULTILINE 模式,^ 可匹配一行文本的行首,$ 可匹配一行文本的行末。当 \b 被包含于字符集合

分享到:
评论

相关推荐

    正则表达式素材5

    通过学习上述知识点,结合《正则表达式入门经典》和“正则表达式解释器实现原理”,你可以构建起坚实的正则表达式基础,从而在日常工作中更高效地处理文本数据,解决各种复杂的字符串匹配问题。同时,不断实践和调试...

    正则表达式到NFA

    正则表达式是一种强大的文本处理工具,广泛应用于编程语言、文本编辑器以及各种搜索和匹配操作。它们可以简洁地描述字符串的模式,如字符的出现次数、特定字符序列等。在计算机科学领域,尤其是编译原理中,正则...

    正则表达式素材4

    《正则表达式解释器实现原理》这部分内容可能涉及如何编写一个解析正则表达式的程序。解释器通常通过以下步骤工作: 1. **词法分析**:将输入的正则表达式分解为一系列原子单元(如字符、量词、特殊符号等)。 2. *...

    C++ 正则表达式 使用手册 源代码

    本手册聚焦于如何有效地利用C++的正则表达式功能,以实现高效且灵活的字符串操作。下面我们将深入探讨C++正则表达式的相关知识点。 1. **正则表达式基础** - 正则表达式是一种特殊的字符序列,用于匹配字符串中的...

    DFA NFA 正则表达式转换

    项目中的代码提供了将正则表达式转化为NFA的算法,这对于理解正则表达式的工作原理和实现词法分析器非常有帮助。 此外,DFA最小化是一个优化过程,通过消除冗余状态,使DFA更加精简且易于理解。这个项目包含了一个...

    正则表达式

    7. **正则表达式解释器实现原理**: - **NFA (Non-Deterministic Finite Automaton)**:非确定性有限状态自动机,是正则表达式解释器的一种常见实现方式,它可以同时尝试多种可能的匹配路径。 - **DFA ...

    [小小明]Python正则表达式全套笔记v0.3(1.8万字干货)

    Python的re模块提供了强大的正则表达式功能,可以方便地实现字符串的匹配、查找、替换和切割等操作。 文档中还提供了贪婪模式、非贪婪模式和独占模式的详细解释,包括回溯算法的工作机制。并且,文档中还提供了正则...

    正则表达式+词法分析

    此外,在编译器和解释器的设计中,正则表达式用于构建词法规则,词法分析器则根据这些规则解析源代码,为后续的语法分析和语义分析打下基础。 总的来说,正则表达式和词法分析是计算机科学中的基础工具,它们的掌握...

    正则表达式学习工具

    C#中的正则表达式操作主要通过`System.Text.RegularExpressions`命名空间下的`Regex`类来实现。这个类提供了多种方法,如`Match`、`Matches`、`IsMatch`、`Replace`和`Split`,它们分别用于单个匹配、所有匹配、验证...

    C#正则表达式 和 测试工具

    在C#中,正则表达式主要通过System.Text.RegularExpressions命名空间下的Regex类来实现。这个类提供了多种方法,如Match、Matches、Replace、Split等,用来执行正则表达式的操作。例如,`Match`方法用于查找字符串中...

    正则表达式最小化DFA

    这些理论和方法对于理解和实现编译器、解释器或任何需要处理文本模式匹配的系统至关重要。在实践中,这些知识也广泛应用于编程语言的解析、文本编辑器的搜索功能以及网络协议的解析等场景。理解并掌握这一过程,对于...

    一个很小的正则表达式测试软件

    2. **模式解释**:可能提供功能,解析并解释正则表达式的各个部分,帮助理解其工作原理。 3. **匹配过程可视化**:通过图形化方式展示匹配过程,使用户直观地看到匹配步骤。 4. **替换功能**:除了验证,还可能支持...

    正则表达式测试工具

    5. **解释器**:一些工具会提供正则表达式的解释,帮助用户理解每个部分的作用。 6. **代码生成**:测试成功后,工具可能会提供生成相应编程语言代码的功能,方便用户将其应用到实际项目中。 在实际使用中,正则...

    正则表达式测试软件国产

    3. 模式解释:对于初学者,软件可能会提供正则表达式模式的解析和解释,以便用户理解其工作原理。 4. 支持多种正则表达式引擎:不同的编程语言或平台可能支持不同版本的正则表达式语法,"Rex.exe"可能兼容多种语法...

    正则表达式素材2

    6. **正则表达式解释器实现原理**:正则表达式的解析通常由编译器完成,它们将正则表达式转化为有限状态自动机(Finite State Machine, FSM),然后通过这个自动机来匹配输入的文本。理解这一过程有助于编写更高效的...

    php_正则表达式.pdf

    正则表达式的概念最早源于20世纪中叶,由Warren McCulloch和Walter Pitts这两位神经生理学家提出的一种数学模型,用于描述神经网络的工作原理。1956年,数学家Stephen Kleene在其论文中正式引入了“正则表达式”的...

    正则表达式库 汇编第二版.rar

    2. **文档**:解释如何使用这些库,包括示例和函数调用说明,帮助开发者理解如何在自己的项目中集成正则表达式功能。 3. **测试用例**:一组示例输入和预期输出,用于验证库的功能是否正确,这对于调试和优化代码至...

Global site tag (gtag.js) - Google Analytics