正则表达式入门

正则表达式入门

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

一、简介

 正则表达式是由原意文本字符(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分钟入门教程

  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值