正则表达式定义
正则表达式,Regular Expression,也常被简写为regex,regexp或RE.
通常用一个正则表达式描述一个特征,然后去验证其他字符串是否符合这个特征.
正则表达式也常被称作一个模式(pattern).
PS:正则表达式精确的语法可能会因程序语言或工具的不同而有所差异.
PPS:本文是学习之记录,如有不妥还望指正.
普通字符和特殊字符
字符分为普通字符和特殊字符.
特殊字符也被称为元字符.
普通字符匹配与自身完全相同的一个字符,如字母,数字等.
什么样的字符叫普通字符呢?除了特殊的,就是普通的,所以本文后面提到的都是特殊的.
通常有一些表可以查询:
如何表示特殊符号本身?
特殊字符前面加反斜杠(\)时表示自身.比如特殊字符^,$等,前面加上\,就表示这个符号本身.
(可能正反斜杠不太容易记忆,所以可以记为右手斜杠).
\就是转义字符,普通加转义变成特殊的,如\d;特殊加转义变成普通的,如\$.
常用元字符
\d匹配一位数字.(因为它是digit的首字母).
\w匹配字母或数字或下划线或汉字等.(联想tip:可能是”字”word的首字母).
\s匹配任意的空白符,包括空格,Tab,换行.(可能因为是space的首字母).
\b代表单词分界处(比如空格,标点符号和换行等),\b不匹配这些符号,只匹配一个位置.(这个想不出为什么了,难道是begin?blank?).
.匹配除了换行之外的任意字符.
上面几个常用元字符的大写字母形式则是其反义,比如\D匹配任意非数字的字符,其他\W,\S,\B的意思可以类推.
一些不便被表示的符号(非打印字符)用转义字符表示,如:
\r,\n代表回车和换行符.
\t代表制表符.
字符集 (中括号[]的使用)
字符集合用方括号组织.
[]中可以罗列元素,如[aeiou]匹配任何一个原因字母.[]中可以包含任意多个字符,可以匹配其中任意一个,但是只能是一个.
[^]是反向字符集,如[^xyz]匹配除了xyz之外的任意一个字符.
正反向的字符集都可以划定范围.比如[0-9][0-9a-z][^A-F0-3]等等.
但是永远要记得:不管方括号[]里面有多少内容,它永远都只匹配一个字符作为匹配内容.
要匹配多个字符,需要用数量限定符.
分组 (小括号()的使用)
中括号介绍完了之后就是小括号了.
小括号是用来分组的, ()符号:
1.在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰;
2.取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到.
总而言之,小括号标记了子表达式的开始和结尾,可以保存子表达式以备将来之用.
小括号的另一种用途是通过语法(?#comment)来包含注释.
指定数量的限定符 (大括号{}用在这里)
*代表前面的内容出现0次到多次.
+代表前面的内容出现1次到多次.
?代表前面的内容出现0次或1次.
{n}代表前面的内容重复n次(不能多也不能少).
{n,}代表前面的内容重复n次或更多次.
{n,m}代表前面的内容重复n到m次.
正则表达式默认是贪婪匹配,即匹配尽可能多的字符,比如a.*b它会匹配以a开始,以b结束的最长的字符串.
但是有时候我们需要懒惰匹配(非贪婪匹配),也即匹配尽可能少得字符,要实现这个效果,只要在数量限定符的后面跟上一个问号?.
这样a.*?b会匹配以a开始,以b结束的最短的字符串.
匹配
一般的正则匹配:当被检测的字符串包含的某个部分符合正则表达式的描述时,称为匹配成功;符合匹配的部分即是匹配到的内容.
但是如果加上^和$限定匹配字符串的开头和结尾,则必须是整个字符串匹配,匹配才能成功.
比如\d是表示数字,\d{5,12}只能保证字符串里包含5到12连续位数字,而^\d{5,12}&则保证整个字符串就是5到12位数字.
^,$和\b都是用来进行边界匹配的,它们本身并不匹配任何字符.
分支条件
用|可以把不同的规则分隔开.左右两边表达式是或的关系,即匹配左边或者右边,可以在多个项之间进行选择.
匹配分支条件时会采取短路原则,即如果前面某个分支已经满足,则不会再测试后面的分支条件.
后向引用
前面介绍的小括号的使用,用来分组,以备后续使用,这里就要介绍怎么使用.
表达式在匹配的时候,会将小括号包含的表达式所匹配到的字符串记录下来,在获取匹配结果的时候,小括号表达式匹配的字符串可以单独获取.
小括号匹配到的字符串,不仅是在匹配结束后才能使用,在匹配过程中也可以使用.
这样就可以匹配重复出现的单词等.
表达式后面的部分,可以引用前面”括号内的子匹配已经匹配到的字符串”,引用方法是反斜杠\加上一个数字.
\1引用第一对括号内匹配到的字符串, \2引用第二对. 比较特殊的是分组0对应整个正则表达式.
如果有嵌套的括号,则外层的括号先排序号(即按照左括号的顺序排序).
也可以自己指定子表达式的组名,语法是:(?<name>exp),其中<>换成单引号也行.
引用自己指定名字的子表达式:\k<name>
组号分配时扫描两遍,第一遍给未命名的组分配,第二遍给命名了的组分配组号.
使用(?:exp)将不捕获匹配的文本,也不给此组分配编号.
零宽断言和负向零宽断言
断言指定了一个条件(可能是正向条件或者负向条件),然后零宽表示所占宽度为零,即自身并不被包含在匹配结果里,就好像\b,^,$等.
两个正向条件的, 即零宽断言:
(?=exp)零宽度正预测先行断言,它断言自身出现的位置后面能匹配表达式exp.
比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分.
(?<=exp)零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp.
比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分.
两个负向条件的, 即负向零宽断言:
(?!exp)零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp.
比如\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字.
(?<!exp)零宽度负后顾后发断言,断言此位置的前面不能匹配表达式exp.
比如(?<![a-z]\d{7})匹配前面不是小写字母的七位数字.
参考资料
正则表达式30分钟入门教程:
wikipedia:
揭开正则表达式的神秘面纱:
msdn正则表达式语法:
正则表达式测试网站:
多种语言的正则表达式在线测试:
JavaScript正则测试:
regex101:
正则表达式状态机生成器:
相关推荐
正则表达式基础学习笔记!!!从基础开始正则表达式基础学习笔记!!!
正则表达式基础正则表达式基础正则表达式基础正则表达式基础
vba正则表达式基础知识介绍,由浅入深,实例讲解
正则表达式基础语法及常用正则表达式及正则手册(HTML版)
Python正则表达式基础,译自官方文档Regular Expression HOWTO
该教程中所介绍的正则表达式应用仅仅是最为简单的(并没有完全地涉及到 Pattern 类支持的所有正则表达式语法,也没有涉及到高级的应用),适合于从未接触过或者是尚未完全明白正则表达式基础的学习者。在学习完该...
主要描述正则表达式的基础,包括正则表达式的格式,举例
javastript正则表达式基础 javastript正则表达式基础 javastript正则表达式基础
正则表达式基础入门教程 1. 本文目标 2. 如何使用本教程 3. 正则表达式到底是什么? 4. 入门 5. 测试正则表达式 6. 元字符 7. 字符转义 8. 重复 9. 字符类 10. 反义 11. 替换 12. 分组 13. 后向引用 14...
本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化正则表达式,这些主题请查看其他教程。 ...
正则表达式基础知识,对于初学者不错的指导。
正则表达式简介 为什么需要正则表达式? 文本的复杂处理。 正则表达式的优势和用途? 一种强大而灵活的文本处理工具; 提供了一种紧凑的、动态的方式,能够以一种完全通用的方式来解决各种字符串...
01C#正则表达式基础教程.doc
常用的正则表达式,包括正则表达式基础讲解,正则表达式格式、例子等
正则表达式基础知识正则表达式基础知识正则表达式基础知识
正则表达式基础知识!!! 我们先从简单的开始。假设你要搜索一个包含字符“cat”的字符串,搜索用的正则表达式就是“cat”。如果搜索对大小写不敏感,单词“catalog”、“Catherine”、“sophisticated”都可以匹配...
Groovy 正则表达式 Groovy正则表达式语法 背景项目使用Gradle作为自动化构建的工具, 闲暇之余对这个工具的使用方式以及其配置文件依赖的Groov
正则表达式 详解 基础 正则表达式之道(A Tao of Regular Expressions)
将正则表达式的基础知识浓缩到一张纸上,超实用~
本文介绍了深入学习正则表达式的基础知识和推荐内容。 本文主要面向对正则表达式知之甚少或没有使用经验,但却熟悉 ASP.NET、可借助 .NET 编程的初学者。此外,希望本文连同 regular expression cheat sheet 成为有...