正则表达式是什么呢?
正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
例如,给定很多字符串,我们要从这些字符串中找到我们所需要的字符串,我们就可以利用正则表达式作为一种约束或者条件只获取符合该正则表达式的字符串。
我们以生活中的座机电话号码为例来简单地对正则表达式有个认识:
这是提取中国固定电话号码的正则表达式:
((\d{3,4})|\d{3,4}-|\s)?\d{8}
下面我们一点一点来学习正则表达式的基础知识,相信学完了下面的内容对上面的正则表达式就能理解了。
字符
一般字符:匹配自身
abc ⇒ abc
. :匹配任意除换行符”\n”外的字符。在DOTALL模式中也能匹配换行符。(关于multiline模式和dotall模式可以自行百度)
a.c ====> abc
\ :转义字符,使后一个字符改变原来的意思。如果字符串中有字符*需要匹配,可以使用\*或者字符集[*].
a\.c => a.c a\\c => a\c
[…] :字符集(字符类)。对应的位置可以是字符集中任意字符。字符集中的字符可以逐个列出,也可以给出范围,如[abc]或[a-c]。第一字符如果是^则表示取反,即[^abc]表示不是abc的其他字符。
所有的特殊字符在字符集中都失去其原有的特殊含义。在字符集中如果要使用]、-或^,可以在前面加上反斜杠,或把]、-放在第一个字符,把^放在非第一个字符。
a[bcd]e => abe ace ade
预定义字符集(可以写在字符集[…]中)
\d 可以匹配数字0-9,相当于[0-9] 例子: a\dc => a1c
\D 可以匹配非数字,相当于[^\d] 例子: a\Dc => abc
\s 可以匹配空白字符,相当于[<space>\t\r\n\f\v] 例子: a\sc => a c
\S 与\s相反,匹配非空白字符,相当于[^\s] 例子: a\Sc => abc
\w 单词字符,相当于[A-Za-z0-9_] 例子: a\wc => abc
\W 非单词字符,相当于[^\w] 例子:a\Wc => a C
数量词(用在字符或(…)之后)
* 匹配前一个字符0或无限次 abc* => ab abcccc
+ 匹配前一个字符一次或无限次 abc+ => abc abccc
? 匹配前一个字符0次或一次 abc? => abc ab
{m} 匹配前一个字符m次 ab{2}c => abbc
{m,n} 匹配前一个字符m至n次,m和n可以省略:若省略m,则匹配0至n次;若省略n,则匹配m至无限次。 ab{1,2}c => abc abbc
*? +? ?? {m,n}? 使* + ?{m,n}变成非贪婪模式 示例将在下文中介绍
边界匹配(不消耗待匹配字符串中的字符)
^ 匹配字符串开头。在多行模式中匹配每一行的开头。 ^abc => abc
$ 匹配字符串末尾。在多行模式中匹配每一行的末尾。 abc$ => abc
\A 仅匹配字符串的开头 \Aabc => abc
\Z 仅匹配字符串末尾 abc\Z => abc
\b 匹配\w和\W之间(一边是单词字符,另一边是非单词字符) a\b!bc => a!bc
\B [^\b] a\Bbc => abc
逻辑、分组
| :代表左右表达式任意匹配一个。它总是先尝试匹配左边的表达式,一旦匹配成功则跳过匹配右边的表达式。如果|没有被包括在()中,则它的范围是整个正则表达式。
abc|def => abc def
(…) :被括起来的表达式将作为分组,从表达式左边开始每遇到一个分组的左括号’(‘,编号+1.另外,分组表达式作为整体,可以后接数量词。表达式中的|仅在该组中有效。
(abc){2} => abcabc a(123|456)c => a123c a456c
(?P<\name>…) (note:name前面的反斜杠去掉) :分组,除了原有的编号外再指定一个额外的别名
(?P<id>abc){2} => abcabc
\<\number> (note:number前面的反斜杠去掉) :引用编号为< number >的分组匹配到的字符串。
(\d)abc\1 => 1abc1 5abc5
(?P=name) 引用别名为< name >的分组匹配到的字符串。
(?P<id>\d)abc(?P=id) => 1abc1 5abc5
特殊构造(不作为分组)
(?:…) :(…)的不分组版本,用于使用’|’或后接数量词。
(?:abc){2} => abcabc
(?iLmsux) :iLmsux的每一个字符代表一个匹配模式,只能用在正则表达式的开头,可选多个。
(?i)abc => Abc
(?#…) :#后面的内容将作为注释被忽略。
abc(?#comment)123 => abc123
(?=…) :之后的字符串内容需要匹配表达式才能匹配成功。不消耗字符串内容。
a(?=\d) => 后面是数字的a
(?!…) :之后的字符串内容需要不匹配表达式才能成功匹配。不消耗字符串内容。
a(?!\d) => 后面不是数字的a
(?<=…) :之前的字符串内容需要匹配表达式才能成功匹配。不消耗字符串内容。
(?<=\d)a => 前面是数字的a
(?
(?<!\d)a => 前面不是数字的a
有了上面的基础知识,我们来看看我们在一开始讲到的中国固定电话号码的正则表达式:
((\d{3,4})|\d{3,4}-|\s)?\d{8}
分析:
((\d{3,4})|\d{3,4}-|\s)?:我们都知道中国固话一般前面有3到4位的区号,直辖市是三位,普通的都是四位,这里用”|”考虑的是有可能区号和后面的电话号码之间会加上-,最后的问号就是表示对前面的表达式匹配一次或0次,因为我们有的时候不会写明区号。
\d{8}: 一般电话号码都是8位,则需要匹配8次数字即可。
一些常用的正则表达式:
参考:
作者:zxin 博客地址:zxin.cnblogs.com
链接:常用的正则表达式大全
2017 9 18