1、 正则表达式元字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意空白字符
\d \d匹配数字
\b 匹配单词的开始或结束
$ 匹配字符串的结束
[abcd] 匹配字符’a’,’b’,’c’,’d’字符
2、 正则表达式的反义
\W 匹配任意不是字母或数字或下划线或汉字
\S 匹配不是空白字符
\D 匹配非数字的字符
\B 匹配不是单词开始或结束的位置
[^X] 除X以外的任意字符
[^aeiou] 匹配字符串的结束
[abcd] 匹配除aeiou字母以外的其它任意字符
3、 重复
* 重复0次或更多次
+ 重复一次或更多次
? 重复0次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次
4、分支条件 |
0\d{2}-\d{8}|0\d{3}-\d{7}这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)。
5、贪婪与懒惰
*? 重复任意次,但尽可能少重复
+? 重复1次或更多次,但尽可能少重复
?? 重复0次或1次,但尽可能少重复
{n,m}? 重复n到m次,但尽可能少重复
{n,}? 重复n次以上,但尽可能少重复
举例1:表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时,匹配的结果是:成功;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。
举例2:相比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。
6、处理选项
Ignorecase 默认情况下,表达式中的字母是要区分大小写的。配置为 Ignorecase 可使匹配时不区分大小写。有的表达式引擎,把 "大小写" 概念延伸至 UNICODE 范围的大小写。
Singleline 默认情况下,小数点 "." 匹配除了换行符(\n)以外的字符。配置为 Singleline 可使小数点可匹配包括换行符在内的所有字符。
Multiline 默认情况下,表达式 "^" 和 "$" 只匹配字符串的开始 ① 和结尾 ④ 位置。如:
①xxxxxxxxx②\n
③xxxxxxxxx④
配置为 Multiline 可以使 "^" 匹配 ① 外,还可以匹配换行符之后,下一行开始前 ③ 的位置,使 "$" 匹配 ④ 外,还可以匹配换行符之前,一行结束 ② 的位置。
Global 主要在将表达式用来替换时起作用,配置为 Global 表示替换所有的匹配。
ExplicitCapture 仅捕获已被显式命名的组。
ECMAScript(JavaScript兼容模式) 使表达式的行为与它在JavaScript里的行为一致。
RightToLeft(从右向左查找) 匹配从右向左而不是从左向右进行。
7、反向引用 \1, \2...
表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 "<td>(.*?)</td>"。
其实,"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "\" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串,"\2" 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。
举例如下:
举例1:表达式 "('|")(.*?)(\1)" 在匹配 " 'Hello', "World" " 时,匹配结果是:成功;匹配到的内容是:" 'Hello' "。再次匹配下一个时,可以匹配到 " "World" "。
举例2:表达式 "(\w)\1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时,匹配结果是:成功;匹配到的内容是 "ccccc"。再次匹配下一个时,将得到 999999999。这个表达式要求 "\w" 范围的字符至少重复5次,注意与 "\w{5,}" 之间的区别。
举例3:表达式 "<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>" 在匹配 "<td id='td1' style="bgcolor:white"></td>" 时,匹配结果是成功。如果 "<td>" 与 "</td>" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。
8、其它通用规则
8.1 表达式中,可以使用 "\xXX" 和 "\uXXXX" 表示一个字符("X" 表示一个十六进制数)
\xXX 编号在 0 ~ 255 范围的字符,比如:空格可以使用 "\x20" 表示
\uXXXX 任何字符可以使用 "\u" 再加上其编号的4位十六进制数表示,比如:"\u4E2D"
8.2在表达式中有特殊意义,需要添加 "\" 才能匹配该字符本身的字符汇总
^ 匹配输入字符串的开始位置。要匹配 "^" 字符本身,请使用 "\^"
$ 匹配输入字符串的结尾位置。要匹配 "$" 字符本身,请使用 "\$"
( ) 标记一个子表达式的开始和结束位置。要匹配小括号,请使用 "\(" 和 "\)"
[ ] 用来自定义能够匹配 '多种字符' 的表达式。要匹配中括号,请使用 "\[" 和 "\]"
{ } 修饰匹配次数的符号。要匹配大括号,请使用 "\{" 和 "\}"
. 匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用 "\."
? 修饰匹配次数为 0 次或 1 次。要匹配 "?" 字符本身,请使用 "\?"
+ 修饰匹配次数为至少 1 次。要匹配 "+" 字符本身,请使用 "\+"
* 修饰匹配次数为 0 次或任意次。要匹配 "*" 字符本身,请使用 "\*"
| 左右两边表达式之间 "或" 关系。匹配 "|" 本身,请使用 "\|"
8.3 如果要要求表达式所匹配的内容是整个字符串,而不是从字符串中找一部分,那么可以在表达式的首尾使用 "^" 和 "$",比如:"^\d+$" 要求整个字符串只有数字。
8.4如果要求匹配的内容是一个完整的单词,而不会是单词的一部分,那么在表达式首尾使用 "\b",比如:使用 "\b(if|while|else|void|int……)\b" 来匹配程序中的关键字。
8.5表达式不要匹配空字符串。否则会一直得到匹配成功,而结果什么都没有匹配到。比如:准备写一个匹配 "123"、"123."、"123.5"、".5" 这几种形式的表达式时,整数、小数点、小数数字都可以省略,但是不要将表达式写成:"\d*\.?\d*",因为如果什么都没有,这个表达式也可以匹配成功。更好的写法是:"\d+\.?\d*|\.\d+"。
8.6能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,那么情况可能比上一条所说的更严重,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手,查找一下是否是本条所说的原因。
8.7或 "|" 的左右两边,对某个字符最好只有一边可以匹配,这样,不会因为 "|" 两边的表达式因为交换位置而有所不同。
分享到:
相关推荐
正则表达式教程合集(各种语言的,超全) 网上收集的包括javascript、vb、.net、perl等等多种语言的正则表达式规则及教程
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emecs 风格的模式。Emacs 风格模式可读性稍差些,而且功能也不强,因此编写新代码时尽量不要再...
6.4 正则表达式引擎的规则 171 6.5 小结 173 第7章 正则表达式模式 174 7.1 验证字符 174 7.2 验证数字 175 7.2.1 只包含数字 175 7.2.2 只包含整型数 175 7.2.3 只包含浮点数 176 7.3 验证电话号码 177 7.4 验证...
虽然正则表达式规则集是用于自动机处理的用例的真实示例,但它们仅占基于自动机的计算的所有用例的一小部分。 随着用于自动机处理的体系结构和软件框架的最新可用性,已经发现许多新的应用程序可以从自动机处理中...
正则表达式中的特殊字符 字符 含意 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界。 -或- 对正则表达式功能字符的还原,如"*"匹配它...
式匹配引擎,在实际应用中,对于不同的匹配规则集和正则语法,不同的匹配引擎会有不同的性能表现。本文通过对 PCRE、Greta、Boost、RE2 四种常用正则表达式匹配引擎的性能测试,给出在不用的正则语法情况下的匹配...
正则表达式语法规则 语法 说明 表达式实例 匹配字符串 字符 . 匹配除换行”\n”外的任意字符串 abc abc \ 转义字符,使后一个字符改变原来的意思 a\\c a\c […] 字符集,对应的...
正则表达式(Regular Expression,简称:Regex)是一种文本模式的表示方法,它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。正则表达式常用于字符串的搜索、替换、分割和校验等操作。 正则表达式由...
通过基于真实网络流量的评测,比较了几种经典匹配算法在不同规则集上的匹配速度、内存占用和预处理时间等性能指标,并给出了不同需求场景下高效正则表达式匹配算法的选择建议,归纳了高性能正则表达式匹配算法的下...
使用正则表达式(RE)来检测攻击或漏洞。 为了跟上不断增长的速度,越来越多的NIDS需要通过专用硬件来实现。 一个主要的瓶颈是NIDS仅逐字节扫描传入的数据包,这极大地限制了它们的吞吐量。 此外,巨大的内存消耗...
该算法基于规则模板对规则集进行分组,各分组分别构建匹配引擎;同时,根据实际规则数目和系统结构改变规则子集的数目,达到更好的匹配效率。理论分析和实验表明,与传统分组算法相比,在存储空间压缩相当情况下,...
web前端-基于规则集的正则表达式匹配算法研究.pdf
通常,像这样的系统的目标是帮助进行数据分析并减少创建正则表达式(作为规则)以帮助构建更大的学习系统可能需要的手动工作量。攻击计划预计第一个版本会产生朴素的正则表达式,这些正则表达式是有限的并且特定于...
字符串是一种重要的数据类型,而正则表达式则是赋予了编程人员更多操作字符串的能力。ES6的创作者为字符串和正则表达式添加了许多的新功能。下面玲珑将来进行一个全面的总结。 字符串和正则两个部分各两节,全文阅读...
为解决正则表达式匹配中内存需求与检测性能的矛盾,首次提出两级存储的匹配方案。将马尔可夫链理论应用于自动机,通过求解稳态向量,得到各状态被随机访问的概率。将高概率的状态表项配置在FPGA嵌入存储器中,低概率...
正则表达式是一种小型的、高度专业化的编程语言,并不是python中特有的,是许多编程语言中基础而又重要的一部分。在python中,主要通过re模块来实现。 正则表达式模式被编译成一系列的字节码,然后由用c编写的匹配...
python正则表达式模块简介 Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。Python 1.5之前版本则是通过 regex 模块提供 Emacs 风格的模式。Emacs 风格模式可读性稍差些,而且功能也不强,因此...
它包括的一些功能包括: 正则表达式乐兴(AST) 正则表达式到NFA的转换NFA到DFA转换(确定) DFA最小化DFA解决方案计数足协平等FA超集/子集测试FA适当的超集/子集测试英足总有一个有效的解决方案FA打印FA导出为DOT ...
虽然类具有自己的规则集(尤其是有关元字符的规则),但交替遵循的是正常正则表达式的相同规则。 与char类不同,交替不能被否定。 角色类 [abcde] -匹配以下任何一个字符: a,b,c,d,e 。 [ae] -匹配以下任何字符:...