正则表达式入门

正则表达式入门
  正则表达式一直都是我畏惧的知识点,之前也尝试着学习,但最终还是放弃了。由于正则在项目中经常能用的到,所以最近强迫自己花空闲时间学习了些简单的正则知识,并将了解到的知识总结在本文中,希望对大家有所帮助。大家在学习正则的时候不要有畏惧的心理,其实正则入门还是比较容易的。

一、简介
 正则表达式是由原意文本字符(a,b,c,1,2,3等)和元字符( . * ? 等)组成来匹配指定内容的表达式。

原意文本字符
 原意文本字符是正则中最基本的字符,比如:

a在正则中表示匹配a这个字符;
1在正则中表示匹配1这个字符;
我在正则中表示匹配我这个字符。
元字符
 指在正则表达式中有特殊含义的专用字符,比如:

“.”表示匹配除换行\n以外的所有字符;
“*”表示匹配前面的子表达式0次或多次;
“?”表示匹配前面的子表达式1次或多次。
 常用的元字符:

元字符 含义 举例
\ 转义字符,将后一个字符标记为特殊字符或将元字符转为原意字符 1、\\表示匹配原意字符\;
2、\.表示匹配英文句号“.”;
3、\d表示匹配数字。
. 匹配除换行(\n)以外的所有字符 abc.能匹配到“abc”后面的那个字符,比如“abc”后面的空格、字母、数字、汉字等
^ 匹配字符串的开始位置,在集合([])中表示“非” 1、^\d\d\d能匹配“123”、“666”等,但不能匹配“a123”、“b123”、“-123”等;
2、^\w+\b表示匹配第一个单词;
3、[^ajl]匹配除了“a”、“j”、“l”以外的任意字符。
$ 匹配字符串的结束位置 ^\d\d\.\d\d$能匹配“12.01”和“00.00”等,但不能匹配“0.00”、“12.0”、“123.00”等
? 匹配前面子表达式0次或一次 good?可以匹配“goo”和“good”等,但是不能匹配“go”等
+
* 匹配前面子表达式0次或多次 zo*能匹配“zo”、“zoo”、“zooo”
() 标记一个子表达式的开始和结束位置,其结束符号“)”是元字符
[ 字符组的起始符号,其结束符号“]”不是元字符
{ 标记限定符的开始,其结束符号“}”不是元字符
| 表示“或” 1、a|b|c匹配“a”、“b”、“c”之中的一个;
 如果要匹配元字符本身可以用\来取消元字符的特殊含义,比如\.匹配英文句号”.”;\*匹配“*”本身;\+匹配“+”本身……


常用表达式举例

表达式 含义 举例
\w 匹配字母、数字、下划线 abc\w表示匹配“abc”开头并且后面跟着一个字母或数字或下划线的字符串
\W 匹配非字母、非数字、非下划线 \W相当于[^\w]
\d 匹配数字 \d\d\d表示匹配3个连续的数字
\D 匹配非数字 \D相当于[^\d]
\b 匹配单词的开始或结束 \bgo\w*\b表示匹配“go”开头的一个单词
\B 匹配非单词的开始或结束 \B相当于[^\b]
\s 匹配任何空白字符,如回车、空格、制表符等 \s相当于[\f\n\r\t\v]
\S 匹配任何非空白字符 \S相当于[^\s]
{n} 匹配前面子表达式n次 \d{11}表示匹配连续的11个数字
{n,m} 匹配前面子表达式n到m次 \d{7,11}表示匹配连续的7-11个数字
{n,} 匹配前面子表达式n次以上 \d{5,}表示匹配连续的5个以上的数字
[xyz] 表示字符集,匹配所包含的任意一个字符 1、[abc]能匹配“a”或“b”或“c”;
2、[!?*.]表示匹配“!”、“?”、“*”、“.”中的任意一个;
3、[^0-9]匹配所有非0到9的字符,相当于\D。
[a-z] 表示字符范围,能匹配范围内的任意一个字符 1、[a-z]能匹配26个小写字母中任意字母;
2、[0-9]能匹配0到9的任意数字,和\d一样的效果;
3、[1-9]能匹配1到9的任意数字;3、[\u4e00-\u9fa5]能匹配所有汉字。
(abc) 组合,将几个项组合成为一个单元,可以对这个单元使用限定符 (\.[a-z]+)+$可以匹配“.com”、“.net”、“.com.cn”等结尾的字符


运算符优先级

  正则表达式是从左向右进行运算的,并遵循优先级顺序。优先级顺序如下表(先高后低):

运算符 优先权 说明
\ 最高 转义字符
() (?:) (?=) [] 高 圆括号和方括号
* + ? {n} {n,} {n,m} 中 限定符
^ $ \任何元字符 任何字符 低 定位点和序列(即:位置和顺序)
| 最低 选择符“或”
二、简单使用
  了解了正则表达式的基本语法后,我们就可以牛刀小试了,好记星不如烂键盘,多敲几遍就就不容易忘记,下面我们通过实例进行学习(注:正则比较灵活,没有标准的表达式,以下所有表达式仅供参考!)。

在编写正则时可以在站长工具进行正则测试

 

验证(^$)是否为手机号(中国)
  分析:由于号码段在不断更新,本文只验证“13”、“15”、“17”、“18”开头后面有9个数字的号码(如表达式1),大家可以根据自己的需求灵活修改(如表达式2)。

  表达式1:^(13|15|17|18)\d{9}$
  表达式2:^(13[0-9]|15[0-9]|17[07]|18[05689])\d{8}$


验证(^$)是否为电话号码(中国)
  电话号码一般为“区号[-]号码”的格式,如果区号部分是3位则号码部分为8位,如021-67678989、02167678989;如果区号部分是4位则号码部分是7位,如0765-6767676、02167678989。

  表达式1:^\d{3}-?\d{8}|\d{4}-?\d{7}$
  表达式2:^(\d{3}-?\d{8})|(\d{4}-?\d{7})$(由于选择符“|”优先级最低,所以组合符号“()”加与不加都行)


验证(^$)是否为邮箱
  邮箱一般为“名称@域名”的格式,由于名称部分格式太多(有些邮箱名称允许有中文)不好限制,所以本文只验证名称和域名有“英文字母”、“数字”、“下划线”、“中划线(-)”、“英文句号(\.)”的邮箱。

\w可以匹配“英文字母、数字、下划线”
\.可以匹配英文句号“ . ”
-可以匹配原意字符“ - ”本身
@可以匹配原意字符“ @ ”本身
([\.-]\w+)可以匹配“ photo-google ”中的“ -google ”、“ photo.google ”中的“ .google ”
(\.[a-zA-z0-9-]+)+可以匹配“ .com ”、“ .com.cn ”等
  表达式:^\w+([\.-]\w+)*@[\w-]+(\.[a-zA-z0-9-]+)+$


验证(^$)是否为身份证号码(中国)
  身份证号码是由18个字符组成,前17个必须为数字(\d),第一位不能为0([1-9]),最后一位可能是数字(\d)也可能是“x/X”([xX])。
  表达式:^[1-9]\d{16}[\dxX]$


匹配HTML中的a标签的链接
  a标签类似为“<a href="http://www.google.com/hk" target="_blank" >Google香港</a>”
  但是也可能会有如下等特殊的情况:

<a href='http://www.google.com/hk'>Google香港</a>
<a target="_blank" href="http://www.google.com/hk">Google香港</a>
<a href ="http://www.google.com/hk">Google香港</a>
  经过分析得出如下表达式:
  表达式:<a[^>]+href[\s]*=[\s]*['"]([^"']*)['"]


匹配HTML中的img标签的图片地址
  匹配img标签和匹配a标签类似,只是标签名称和资源属性不同。
  表达式:<img[^>]+src[\s]*=[\s]*['"]([^"']*)['"]


三、总结说明
  本文只是入门教程,让你学习完后能使用基本的表达式进行匹配。如果学习正则的时候遇到问题,可以阅读下面的“参考文档”,这些文档写的非常详细,语言也更加严谨。由于本人也是刚学正则,文章里有错误的地方欢迎大家指正。

参考文档
1、维基百科——正则表达式
2、正则表达式 - 语法
3、正则表达式30分钟入门教程

点赞 5
————————————————
版权声明:本文为CSDN博主「Samuel_86」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/make164492212/java/article/details/51699545

posted @ 2020-04-14 11:24  GaoYanbing  阅读(167)  评论(0编辑  收藏  举报