春满大地,富贵花开。微雨众卉新,一雷惊蛰始。敬请关注微信公众号:AiryData。

正则表达式基础

JAVA Airy 2602℃ 0评论

什么是正则表达式

一句话定义:正则表达式是一些用来匹配和处理文本的字符串。

正则表达式的用途

搜索文件特定单词、匹配URL生成HTML代码中的a标签,匹配国内手机号、匹配用户注册信息中email地址是否正确,像Excel一样查找替换,判断用户名是否以字母或数字开头等等。

如何使用正则表达式

(一)匹配单个字符

1、匹配纯文本

文本:Hello, my name is Airy. Please visit,my website at http://www.airyyun.com

regex:Airy

匹配结果:Airy

Regex:my

匹配结果:

PS:一般情况下,有多个匹配结果时,在原始的正则表达式里会返回所有结果,其他的语言一般只返回一个,具体语言具体分析。

Regex是区分字母大小写的,所以Airy不匹配airy,大多数其他编程语言中正则表达式的实现支持不区分字母大小写,一般用i标志来强制执行不区分字母大小写的搜索。

2、匹配任意字符

“.”字符(英文句号)可以匹配任何一个单个的字符。

正则里的.字符相当于DOS的?字符,相当于SQL里的_(下划线)字符。

继续使用上面的文本匹配:

Regex:w.

匹配结果:

w.把we、ww、w.都匹配了出来,这个随机匹配,可以看到“.”可以匹配任何单个的字符、字母、数字、甚至是“.”字符本身。

再看一个regex:.w.(可以使用多个“.”可以连续,也可以不连续)

匹配结果:

可以看出,w之前有则匹配(包括空格),没有则不匹配。

3、匹配特殊字符

“.”字符是特殊字符,如果模式里需要一个,就要告诉正则“.”是它本身。此时,需要在“.”的前面加上一个\(反斜杠)字符来对它进行转义。\是一个元字符。

此时来匹配一下上面那个URL的.com

Regex:.u.\.com

匹配结果:

第1个.匹配y,第2个.匹配n,接下来,\.匹配域名和com的分隔符.本身,最后的com匹配它本身。

PS.正则里,\字符永远出现在一个有着特殊含义的字符序列的开头。如果需要搜索\本身,也必须对\字符进行转义,即用两个连续的\\。

(二)匹配一组字符

 1、匹配多个字符中的某一个

原文本:www.airyyun.com,www.oschina.com,www.sina.cn,www.sina.com,www.renrenche.com

现在只想匹配网址中带i的前面是h和s的两个,此时不能使用.来匹配任意字符,需要使用元字符[和]来定义一个字符集合,在使用[和]定义的字符集合里,这两个元字符之间的所有字符都是该集合的组成部分,字符集合的匹配结果是能够与该集合里的任意一个成员相匹配的文本。

Regex:[hs]i..\.com

匹配结果:

这里的正则表达式以[hs]开头,这个集合将匹配字符n或s(但是不匹配a和其他字符)。[和]不匹配任何字符,它们只负责定义一个字符集合。

PS.虽然结果正确,但模式[hs]i..\.com并不是最正确的答案,如果上面还有一个wsina.com,它也会被匹配出来,这里涉及位置匹配问题,后面讨论。

字符集合在不需要区分字母大小写的时候:

文本:RegEx or regex

正则:[Rr]eg[Ee]x

结果:

[Rr]负责匹配字母R和r  [Ee]负责匹配字母E和e。

 2、利用字符集合区间

文本:sam.com,na1.com, na2.com, ca1.com, sa1.com

正则:[ns]a[0123456789]\.com

结果:

此时,我们改用了另外一个模式,这个模式的匹配对象是:第1个字符必须是n或s,第2个字符必须是a,第3个可以是任何一个数字。正则中 特殊元字符—-字符区间可以用-(连字符)来定义。

上面的正则可以简化为:[ns]a[0-9]\.com,结果一样。

字符区间不仅限于数字,以下都是合法的字符区间:

A-Z:匹配从A到Z的所有大写字母

a – z:匹配从a到z的所有小写字母

A – z:匹配ASCII字符A到ASCII字符z的所有字母,这个模式一般不常用,因为它还包含着[和^等在ASCII字符表里排列在Z和a之间的字符。

PS.定义字符区间的时候,要避免这个区间的尾字符小于它的首字符(如[9-6])。这种区间没有意义,而且往往会让整个模式失效。

“-”(连字符)是一个特殊的元字符,作为元字符它只能用在[和]之间,在字符集合以外的地方,-只是一个普通字符,只能与-本身相匹配,正则里,-字符不需要被转义。

同一个字符集合里可以给出多个字符区间。如:[A-Za-z0-9],这样的语法更简单。

例子:这次要查找RGB值(用一个十六进制数字给出的红、绿、蓝三基色的组合值,计算中可以根据RGB值把有关的文字或图像显示为由这三种颜色按给定比例调和出来的色彩)。网页中,RGB值是以#000000(黑色)、#FFFFFF(白色)、#FF0000(红色)的形式给出的。RGB值用大写或小写字母给出均可,所以#FF00ff(品红色)也是合法的RGB值。

文本:

<BODY BGCOLOR=”#336633”  TEXT=”#FFFFFF”

MARGINWIDTH=”0” MARGINHEIGHT=”0”

TOPMARGIN=”0” LEFTMARGIN=”0”>

正则:#[0-9A-Fa-f][ 0-9A-Fa-f][ 0-9A-Fa-f] [0-9A-Fa-f][ 0-9A-Fa-f][ 0-9A-Fa-f]

结果:

上面的正则是匹配了以#开头,然后是6个数字或字母A-F(忽略大小写)的字符串。

3、取非匹配

除了那个字符集合里的字符,其他字符都可以匹配。可以用元字符^来表明你想对一个字符集合进行取非匹配—-与逻辑非运算很相似,只是这里的操作符是字符集合而已。

文本:sam.com,na1.com,na2.com,ca1.com,sa1.com

正则:[ns]a[^0-9]\.com

结果:

这个与上一个例子的结果正好相反,[^0-9]匹配的是任何不是数字的字符。结果如上。

(三)、使用元字符

1、对特殊字符进行转义

元字符是一些在正则表达式里有着特殊含义的字符,所以这些字符不能用来代表它们本身。

下面用正则去匹配一个包含[和]字符的JavaScript数组:

文本:

var myArray = new Array();

if (myArray[0] == 0) {

}

直接使用正则:myArray[0]没有匹配结果,这个正则只能匹配myArray0。

使用带有转义字符(\)的正则表达式:myArray\[0\]

结果:

如果想匹配数组元素0到9,则正则表达式应该为:myArray\[[0-9]\]。

任何一个元字符都可以通过给它加上一个反斜杠字符(\)作为前缀来转义。

\也是一个元字符,在需要匹配\本身的时候,我们必须把它转义为\\。

例子:

文本:\home\down\2017\

正则:\\

结果:

\\匹配\,总共有4个。

2、匹配空白字符

空白元字符有:

[\b]    回退(并删除)一个字符(backspace键)

\f              换页符

\n            换行符

\r             回车符

\t             制表符(tab键)

\v             垂直制表符

文本:(可以看到中间有空白行)

“101”,”male”,”Airy”

“102”,”male”,”boy”

 

“103”,”female”,”girl”

“104”,”female”,”mm”

正则:\r\n\r\n

结果:为空(因为中间那一行是空)

\r\n匹配一个“回车+换行”组合,上面的正则匹配的在正式中间的空白行。

3、匹配特定的字符类别

匹配数字:\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])

匹配十六进制或八进制数值: 十六进制数值前要用前缀\x来给出。比如\x0A对应于ASCII字符10(换行符),效果等价于\n。

八进制数值要用前缀\0来给出,数值本身可以是两位或三位数字,比如\011对应于 ASCII字符9(制表符),效果等价于\t。

(四)、重复匹配

1、匹配一个或多个字符

要想匹配同一个字符(或字符集合)的多次重复,只要简单的给这个字符(或字符集合)加上一个+字符作为后缀就行了。+匹配一个或多个字符(至少一个)。

下面匹配一下电子邮件的地址(这里需要考虑多级域名和用户名前面带有.):

“101”,”male”,”Airy”,airy@163.com,”102″,”male”,”boy”boy@renrenche.com, abc.def@sina.com.cn

正则:[\w.]+@[\w.]+\.\w+

结果:

2、匹配零个或多个字符

+匹配一个或多个,但是不匹配零个。这种匹配需要使用*元字符来做。

重新匹配电子邮件地址,(此时需要考虑电子邮件地址的要求:一般是以字符或下划线等开始,这时,上面的正则就有问题了)

文本:

“101”,”male”,”Airy”,airy@163.com, .qwert@baidu.com

“102”,”male”,”boy”boy@renrenche.com, abc.def@sina.com.cn

正则:\w+[\w.]*@[\w.]+\.\w+

结果:

可以看到,上面的qwert前面的.没有匹配出来。

3、匹配零个或一个字符

另一个非常有用的元字符是?。?只能匹配一个字符(或字符集合)的零次或一次出现,最多不超过一次。

下面匹配一下URL地址来验证,因为现在的网站的安全问题,所以互联网推出了更安全的HTTPS协议,有的还是http协议,所以我们的网站开头有这两中情况,现在来验证一下:

文本:old:http://www.airyyun.com/,,,sec:https://www.airyyun.com/

正则:https?://[\w./]+

结果:

可以看到两个URL都被匹配出来了。?这里的含义是:我前面的字符(s)要么不出现,要么最多出现一次。

4、匹配的重复次数

重复次数要用{和}字符给出来—-把数值写在他们之间,可以设定一个精确的匹配次数。或者设定一个区间,即为重复匹配次数设定一个最小值和一个最大值(如{2,4}),或者设置匹配“至少重复多少次(比如{3,})”,等价于“必须重复匹配3次或更多次”。

文本:2017-02-18,2017-02-19, 1001:$108.00,1002:$123.123

正则:\d{2,4}[-\/]\d{1,2}[-\/]\d{1,2} or \d+:\$\d{3,}\.\d{2}

结果:

5、防止过度匹配(贪婪和非贪婪)

贪婪:*、+、{n,}

非贪婪:*?、+?、{n,}?

6、位置边界

\b用来匹配一个单词的开始或结尾,如\bcat\b,\b只匹配一个位置。

\B来查找其前后都有多余空格的连字符:如\B-\B。

^用来定义字符串的开头,$用来定义字符串的结尾。

总结

以上就是正则表达式的基本常用知识,用来科普可以,实际应用还要看具体情况和操作环境以及使用的语言(后续有),敬请期待。

转载请注明:数据之美 » 正则表达式基础

喜欢 (10)or分享 (0)
发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址