正则表达式必知必会
Posted dasha50
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式必知必会相关的知识,希望对你有一定的参考价值。
1.简介
正则表达式(regular expression,简称regex)是一些用来匹配和处理文字的字符串,能够完成各种复杂的文本处理工作,是文本处理方面功能最强大的工具之一。它有两种基本用途:搜索和替换。给定一个正则表达式,它要么匹配一些文本,要么替换一些文本。正则表达式可以在几乎所有的程序设计语言中和几乎所有的计算机平台上使用。这里介绍常见的正则表达式用法。
2.用法
2.1 匹配单个字符
2.1.1 匹配纯文本
文本:my name is liu.
正则表达式:liu
匹配结果:liu
解释:直接匹配纯文本,且区分大小写。
2.1.2 匹配任意字符
特殊含义字符:.(英文句号),可以匹配任何一个单个的字符
文本:
sales1.xls
sales2.xls
orders1.xls
正则表达式:sales.
匹配结果:
sales1
sales2
解释:.可以匹配单个字符,因此可以匹配到1或2,如果想在文本中匹配到.这个字符,使用:\\.,用\\字符进行转义。
2.2匹配一组字符
2.2.1 匹配多个字符中的某一个
字符集合:[],[]能匹配括弧内的任何一个字符。
文本:
sales1.xls
na1.xls
na2.xls
sa1.xls
正则表达式:[ns]a.\\.xls
匹配结果:
na1.xls
na2.xls
sa1.xls
解释:[ns]能匹配其中n或者s中的任意一个。
2.2.2 利用字符集合区间
文本:
na1.xls
na2.xls
sa1.xls
正则表达式:[ns]a[0-9]\\.xls
匹配结果:
na1.xls
na2.xls
sa1.xls
解释:[0-9]相当于[0123456789]中的任意数字字符。相同的还有[A-Z],[a-z],[A-F],[A-Za-z0-9]。如果集合内有^,表示取非操作,如[^0-9],表示非数字,例如sam.xls。
2.3使用元字符
2.3.1 对特殊字符进行转义
元字符是在正则表达式中有特殊含义的字符,例如:英文句号(.),左方括号[,等。因为这些元字符在正则表达式中有特殊的含义,所以这些字符无法代表它们本身,比如你不能使用[来匹配[本身。也不能使用.来匹配.本身。如果要匹配本身就要加个反斜杠\\对它进行转义:\\.匹配.本身。
文本:
if ( tmp[0] = 0 ):
正则表达式:
tmp\\[0\\]
结果:
tmp[0]
解释:\\[对[进行了转义,匹配[本身。
2.3.2 匹配特定的字符类别
匹配某一类别的字符称为元字符,介绍一些常用的元字符:
数字元字符:
\\d:任何一个数字字符(等价于[0-9])
\\D:任何一个非数字字符(等价于[^0-9])
匹配字母和数字:
\\w:任何一个字母数字字符(大小写均可)或下划线字符(等价于[a-zA-Z0-9_])
\\W:任何一个非字母数字或者下划线的字符(等价于[^a-zA-Z0-9_])
匹配空白字符:
\\s:任何一个空白字符(等价于[\\f\\n\\r\\t\\v])
\\S:任何一个非空白字符(等价于[^\\f\\n\\r\\t\\v])
2.4重复匹配
2.4.1 匹配一个或多个字符
+匹配一个或多个字符(至少一个,不匹配零个字符的情况)。比如,a匹配a本身,a+将匹配一个或多个连续出现的a。如果匹配+本身使用\\+。
文本:
send email to liu@email.com or name.liu@email.com, IF your message is urgent try to liu@name.email.com
正则表达式:
\\w+@\\w+\\.\\w+
匹配结果:
liu@email.com
liu@name.email
解释:按照格式进行匹配\\w+多个字符。但是name.liu@email.com也是一个合法字符没被匹配。因此需要使用正则表达式:[\\w\\.]+@[\\w.]+\\.\\w+来匹配。
2.4.2 匹配零个或多个字符
*和+的用法一样,只要把它放在一个字符(或者一个字符集合)的后面,就可以匹配该字符(或字符集合)连续出现零次或者多次情况。比如,B.*Forta将匹配B Forta,B. Forta、Ben Forta和其他有类似规律的组合。
文本:
Hello .liu@email.com is my email address
正则表达式:
\\w+[\\w.]*@[\\w.]+\\.\\w+
结果:
liu@email.com
分析:电子邮箱地址的第一个字符必须是一个字母或者数字字符,根据这一要求,要将\\w放在首位,[\\w.]出现零次或者多次,负责@之前的所有字符。
2.4.3 匹配零个或一个字符
?只能匹配一个字符(或字符集合)的零次或一次出现,最多不超过一次。
文本:
The url is http://www.forta.com/, to connect securely use https://www.forta.com/ instead.
正则表达式:
https?//[\\w./]+
结果:
http://www.forta.com/
https://www.forta.com/
解析:?跟在s后面表示匹配http或者https。
2.4.4 匹配的重复次数
数值写在之间设定重复次数,如2,3重复最少2次,最多3次。2,最少匹配2次,3匹配三次。
文本:
4/8/03
10-6-2004
2/2/2
01-01-01
正则表达式:
\\d1,2[-\\/]\\d1,2[-\\/]\\d2,4
结果:
4/8/03
10-6-2004
01-01-01
解释:\\d匹配数字,[-\\/](这里\\/其实是/的转义)用来匹配日期值里的分隔符-或/。
2.4.5 防止匹配过度
文本:
This offer is not available to customers
living in <B>AK</B> and <B>HI</B>
正则表达式:
<[Bb]>.*</[Bb]>
匹配结果:
<B>AK</B> and <B>HI</B>
解释:*和+都是“贪婪型”元字符,它们在进行匹配时的行为模式是多多益善而不是适可而止。它们会尽可能地从一段文本的开头一直匹配到这段文本的末尾,而不是从这段文本的开头匹配到碰到第一个匹配为止。在不需要“贪婪型”的时候,选择使用“懒惰型”版本。懒惰型版本元字符只需要在贪婪型元字符加上一个?后缀即可。如*?,+?,n,?等。
正则表达式:
<[Bb]>.*?</[Bb]>
结果:
<B>AK</B>
<B>HI</B>
2.4.6 使用子表达式
有一些短语虽然是由多个单词构成,但是其实是一个整体。
文本:
Hello, my name is liu. I like book;book; and other things.
正则表达式:
book;2,
结果:
空
解释:这里使用book;2,的本意是匹配两个连续的book;,但是2,紧挨着;所以只能匹配像book;;;这样的模式。所以使用子表达式,子表达式是用()括号括起来的。
正则表达式:
(book;)2,
结果:
book;book;
解释:(book;)是一个子表达式,它将被视为一个独立元素,紧跟在它后面的2,将作用于这个子表达式。
2.4.7回溯引用匹配
假设你有一段文本,想将这段文本里所有连续重复出现的单词炒出来,显然,在搜索某个单词的第二次出现时,这个单词是已知的。回溯引用允许正则表达式模式引用前面的匹配结果。
文本:
This is a block of of text,
several words here are are
repeated, and and they
should not be.
正则表达式:
[ ]+(\\w+)[ ]+\\1
结果:
of of
are are
and and
解释:[ ]+匹配一个躲着多个空格,\\w+匹配一个或多个字母数字字符,[ ]+匹配随后的空格。\\w是括在括号里的,它是一个子表达式,这个模式的最后一个部分是\\1,这是一个回溯引用,而它应用的正是前面划分出来的那个子表达式,当(\\w+)匹配到单词of的时候,\\1也匹配单词of;当(\\w+)匹配到单词and的时候,\\1也匹配单词and。
\\1代表的是模式里的第1个子表达式,\\2代表着第2个子表达式,以此类推。于是,在上面的那个例子里,[ ](\\w+)[ ]+\\1将匹配同一个单词的连续两次重复出现。
小结
上述仅涉及正则表达式的部分内容,还有前后查找,嵌入条件等没有介绍,感兴趣的读者请自行google。
传送门
[1] 正则表达式必知必会
以上是关于正则表达式必知必会的主要内容,如果未能解决你的问题,请参考以下文章