前言:正则表达式,对于很多人来说,一眼看去就是头皮发麻,没有什么规律可言,其实正则的所用到的字符并不是很多,主要难在于组合匹配,这个也没什么捷径可走,多练就好,前提是知道基本语法,下面介绍基本语法。
1、什么是正则表达式
正则表达式:也称为规则表达式,英文名称Regular Expression,我们在程序中经常会缩写为regex或者regexp,专门用于进行文本检索、匹配、替换等操作的一种技术。
注意:正则表达式是一种独立的技术,并不是某编程语言独有的
关于正则表达式的来历:
long long long years ago,美国新泽西州的两个人类神经系统工作者,不用干正事也能正常领工资的情况下,有段时间闲的发慌,于是他们开始研究一个课题~怎么使用数学方式来描述人类的神经网络。
这一研究,还真是搞事!另一个数学家Stephen Kleene根据他们的研究基础,通过数学算法处理,发布了《神经网事件表示法》,利用的就是正则集合的数学符号描述这个模型,正则表达式的概念进入了人们的视线。
又来了一个搞事的人~某个家伙上学学完正常的课程之后(这事在中国貌似发生不了),开始捣鼓计算机操作系统,并且搞出了现在在软件行业非常出名的系统:Unix,它就是Unix之父Ken Thompson,这个家伙也看到了那个数学家发布的论文,于是将正则表达式经过优化处理之后,引入到了Unix操作系统中专门用于文本的高效检索。
一发不可收拾,正则表达式,开始陆陆续续在各个编程语言中出现,并以它优雅的表现形式和高效的工作态度,而著名于各个语言和行业方向。
正则表达式,是一种特殊的符号,这样的符号是需要解释才能使用的,也就是需要正则表达式引擎来进行解释,目前正则表达式的引擎主要分三种:DFA,NFA、POSIX NFA,有兴趣了正则表达式引擎的,可以自己查看资料。
2、正则字符
2.1、元字符介绍
元字符 | 描述 |
---|---|
^ | 边界匹配符,会匹配行或者字符串的起始位置 |
$ | 边界匹配符,会匹配行或者字符串的结束位置 |
. | 匹配任意一个字符 |
\s | 匹配一个不可见字符(空格、制表符\t、换行符\n、回车符\r…) |
\S | 匹配一个任意可见的字符 |
\d | 匹配一个数字字符,等价于[0-9] |
\D | 匹配一个非数字字符,等价于[^0-9] |
\w | 匹配一个数字、字母、下划线中的任意一个字符,等价于[0-9a-zA-Z_] |
\W | 匹配一个非数字、字母、下划线中的任意一个字符,等价于[^0-9a-zA-Z_] |
\b | 匹配一个单词的边界 |
\B | 匹配不是单词的开头或者结束的位置 |
2.2、量词
首先理解两个概念:
贪婪:贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,如果失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它会每次回退一个字符,直到找到匹配的内容或者没有字符可以回退。
懒惰(非贪婪):从目标的起始位置开始匹配,如果匹配成功,就返回,不再向后匹配。
量词 | 描述 |
---|---|
* | 匹配0次或多次,默认贪婪,尽可能匹配多的 |
+ | 匹配1次或多次,默认贪婪,尽可能匹配多的 |
? | 匹配0或1次 |
{m} | 重复m次 |
{m,n} | 重复m至n次,默认贪婪 |
{m,} | 至少重复m次 |
{,n} | 之多重复n次 |
2.3、 懒惰限定符
“*?” 重复任意次,但尽可能少重复
“+?” 重复1次或更多次,但尽可能少重复,与上面一样,只是至少要重复1次
“??” 重复0次或1次,但尽可能少重复
“{n,m}?” 重复n到m次,但尽可能少重复
“{n,}?” 重复n次以上,但尽可能少重复
3、正则进阶
捕获分组:
“(exp)” 匹配exp,并捕获文本到自动命名的组里
“(?exp)” 匹配exp,并捕获文本到名称为name的组里
“(?:exp)” 匹配exp,不捕获匹配的文本,也不给此分组分配组号
以下为零宽断言
“(?=exp)” 匹配exp前面的位置
如 “How are you doing” 正则”(?.+(?=ing))” 这里取ing前所有的字符,并定义了一个捕获分组名字为 “txt” 而”txt”这个组里的值为”How are you do”;
“(?<=exp)” 匹配exp后面的位置
如 “How are you doing” 正则”(?(?<=How).+)” 这里取”How”之后所有的字符,并定义了一个捕获分组名字为 “txt” 而”txt”这个组里的值为” are you doing”;
“(?!exp)” 匹配后面跟的不是exp的位置
如 “123abc” 正则 “\d{3}(?!\d)”匹配3位数字后非数字的结果
“(?<!exp)” 匹配前面不是exp的位置
如 “abc123 ” 正则 “(?<![0-9])123” 匹配”123”前面是非数字的结果也可写成”(?!<\d)123”