转自: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)普通字符和元字符
普通字符是那些表示自身的字符,例如从a到z,A到Z,0到9等;
元字符具有特殊意义,如‘.’,表示除了‘\n’外的所有字符,其他具有此功能的有
表1 元字符
元字符
|
特殊意义
|
^
|
匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"
|
$
|
匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$"
|
.
|
匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."
|
*
|
修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*"
|
+
|
修饰匹配次数为至少 1 次。要匹配“+” 字符本身,请使用 “\+”
|
?
|
修饰匹配次数为 0 次或 1 次。要匹配 “?” 字符本身,请使用 “\?”
|
=
|
用于前向引用或向后引用
|
!
|
用于前向引用或向后引用
|
:
|
用于前向引用或向后引用
|
|
|
用于前向引用或向后引用
|
\
|
转义用
|
/
|
用于前向引用或向后引用
|
()
|
标记一个子表达式的开始和结束位置。要匹配小括号,请使用 “\(“ 和 “\)”
|
[]
|
用来自定义能够匹配 ‘多种字符’ 的表达式。要匹配中括号,请使用“\[“ 和 “\]”
|
{}
|
修饰匹配次数的符号。要匹配大括号,请使用 “\{“ 和 “\}”
|
元数据如要表示自身,那么需要用’\’来辅助转义
B)字符类
单个的字符可以组成字符类,其语法为用’[’与’]’组成,例如[abcA-Z79]表示可以匹配a,b,c与A到Z,7,9的字符
其中’-’为连字符,表示字符的跨度。
‘^’在”[]”间也是特殊字符,表示取反
其他的特殊字符如下表:
表2 字符类中的预定义字符类
预定义字符类
|
特殊意义
|
^
|
在紧跟’[’表示取反,表示自身要转义
|
-
|
在字符间,表示连字符,如要表示自身,须紧接在’[’或’[^’之后
|
.
|
小数点可以匹配除了换行符(\n)以外的任意一个字符
|
\d
|
可以匹配任何一个 0~9 数字字符
|
\D
|
D大写,可以匹配任何一个非数字字符
|
\s
|
可以匹配空格、制表符、换页符等空白字符的其中任意一个
|
\S
|
S大写,可以匹配任何一个空白字符以外的字符
|
\w
|
可以匹配任何一个字母或者数字或者下划线
|
\W
|
W大写,可以匹配任何一个字母或者数字或者下划线以外的字符
|
JavaScript无POSIX格式
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,那么要么a或bc都可以匹配,如果(a|b)c则为匹配ac或bc。
如果我们在上例中设置了”()”,那么这就是分组,每个分组都可以被引用,如(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 被包含于字符集合
分享到:
相关推荐
通过学习上述知识点,结合《正则表达式入门经典》和“正则表达式解释器实现原理”,你可以构建起坚实的正则表达式基础,从而在日常工作中更高效地处理文本数据,解决各种复杂的字符串匹配问题。同时,不断实践和调试...
正则表达式是一种强大的文本处理工具,广泛应用于编程语言、文本编辑器以及各种搜索和匹配操作。它们可以简洁地描述字符串的模式,如字符的出现次数、特定字符序列等。在计算机科学领域,尤其是编译原理中,正则...
《正则表达式解释器实现原理》这部分内容可能涉及如何编写一个解析正则表达式的程序。解释器通常通过以下步骤工作: 1. **词法分析**:将输入的正则表达式分解为一系列原子单元(如字符、量词、特殊符号等)。 2. *...
本手册聚焦于如何有效地利用C++的正则表达式功能,以实现高效且灵活的字符串操作。下面我们将深入探讨C++正则表达式的相关知识点。 1. **正则表达式基础** - 正则表达式是一种特殊的字符序列,用于匹配字符串中的...
项目中的代码提供了将正则表达式转化为NFA的算法,这对于理解正则表达式的工作原理和实现词法分析器非常有帮助。 此外,DFA最小化是一个优化过程,通过消除冗余状态,使DFA更加精简且易于理解。这个项目包含了一个...
7. **正则表达式解释器实现原理**: - **NFA (Non-Deterministic Finite Automaton)**:非确定性有限状态自动机,是正则表达式解释器的一种常见实现方式,它可以同时尝试多种可能的匹配路径。 - **DFA ...
Python的re模块提供了强大的正则表达式功能,可以方便地实现字符串的匹配、查找、替换和切割等操作。 文档中还提供了贪婪模式、非贪婪模式和独占模式的详细解释,包括回溯算法的工作机制。并且,文档中还提供了正则...
此外,在编译器和解释器的设计中,正则表达式用于构建词法规则,词法分析器则根据这些规则解析源代码,为后续的语法分析和语义分析打下基础。 总的来说,正则表达式和词法分析是计算机科学中的基础工具,它们的掌握...
C#中的正则表达式操作主要通过`System.Text.RegularExpressions`命名空间下的`Regex`类来实现。这个类提供了多种方法,如`Match`、`Matches`、`IsMatch`、`Replace`和`Split`,它们分别用于单个匹配、所有匹配、验证...
在C#中,正则表达式主要通过System.Text.RegularExpressions命名空间下的Regex类来实现。这个类提供了多种方法,如Match、Matches、Replace、Split等,用来执行正则表达式的操作。例如,`Match`方法用于查找字符串中...
这些理论和方法对于理解和实现编译器、解释器或任何需要处理文本模式匹配的系统至关重要。在实践中,这些知识也广泛应用于编程语言的解析、文本编辑器的搜索功能以及网络协议的解析等场景。理解并掌握这一过程,对于...
2. **模式解释**:可能提供功能,解析并解释正则表达式的各个部分,帮助理解其工作原理。 3. **匹配过程可视化**:通过图形化方式展示匹配过程,使用户直观地看到匹配步骤。 4. **替换功能**:除了验证,还可能支持...
5. **解释器**:一些工具会提供正则表达式的解释,帮助用户理解每个部分的作用。 6. **代码生成**:测试成功后,工具可能会提供生成相应编程语言代码的功能,方便用户将其应用到实际项目中。 在实际使用中,正则...
3. 模式解释:对于初学者,软件可能会提供正则表达式模式的解析和解释,以便用户理解其工作原理。 4. 支持多种正则表达式引擎:不同的编程语言或平台可能支持不同版本的正则表达式语法,"Rex.exe"可能兼容多种语法...
6. **正则表达式解释器实现原理**:正则表达式的解析通常由编译器完成,它们将正则表达式转化为有限状态自动机(Finite State Machine, FSM),然后通过这个自动机来匹配输入的文本。理解这一过程有助于编写更高效的...
正则表达式的概念最早源于20世纪中叶,由Warren McCulloch和Walter Pitts这两位神经生理学家提出的一种数学模型,用于描述神经网络的工作原理。1956年,数学家Stephen Kleene在其论文中正式引入了“正则表达式”的...
2. **文档**:解释如何使用这些库,包括示例和函数调用说明,帮助开发者理解如何在自己的项目中集成正则表达式功能。 3. **测试用例**:一组示例输入和预期输出,用于验证库的功能是否正确,这对于调试和优化代码至...