加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

实用的正则表达式的总结

发布时间:2020-12-14 01:13:43 所属栏目:百科 来源:网络整理
导读:我们的项目中,经常会用遇到即使要判断用户输入的手机号码,电话号码,邮箱的格式是否正确的情况,以防止存入了错误的内容,对用户体验也好,所以熟悉和会使用正则表达式会让我们事半功倍。 说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(

我们的项目中,经常会用遇到即使要判断用户输入的手机号码,电话号码,邮箱的格式是否正确的情况,以防止存入了错误的内容,对用户体验也好,所以熟悉和会使用正则表达式会让我们事半功倍。

说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件

在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。

学习正则表达式,必须熟记其中的一些规则,对于一些简单且常用的规则,一定是要熟记的,这样看到复杂的正则表达式,我们就能以不变应万变

常用的规则

1.范围

表达式 说明
w 任意一个字母或数字或下划线,相当于[a-zA-Z0-9_]
s 任意空白字符,相当于[ rnftv]
d 任意一个数字,相当于[0-9],即0~9 中的任意一个
W w取反,相当于[^a-zA-Z0-9_]
S 任意非空白字符,s取反,相当于[^ rnftv],还有空格
D 任意一个非数字字符,d取反,相当于[^0-9]

例如:

wsd”在匹配“Windows 2003”时,匹配成功,匹配的结果为“s 2”。

2.元字符

表达式 说明
- 范围标识符 [a-z]表示匹配a到z的字符
. 匹配除了换行符 n 以外的任意一个字符
^ 匹配字符串开始的位置,不匹配任何字符
$ 匹配字符串结束的位置,不匹配任何字符
b 匹配单词边界,不匹配任何字符

例如:

“^a”在匹配“cba”时,匹配失败,因为表达式要求开始位置后面是字符“a”,而“cba”显然是不满足的。

“d$”在匹配“123”时,匹配成功,匹配结果为“3”,这个表达式要求匹配结尾处的数字,如果结尾处不是数 字,如“123abc”,则是匹配失败的。

3.转义字符

表达式 说明
r,n 回车和换行
匹配“”本身
^,$,. 分别匹配“^”、“$”和“.”

4.量词

表达式 说明
{m} 表达式匹配m次 “d{3}”相当于“ddd ”“(abc){2}”相当于“abcabc”
{m,n} 表达式匹配最少m次,最多n次d{2,3}”可以匹配“12”或“321”等2到3位的数字
表达式至少匹配m次“[a-z]{8,}”表示至少8位以上的字母
* 表达式匹配0次或任意多次,相当于{0,}“<[^>]*>”中“[^>]*”表示0个或任意多个不是“>”的字符
+ 表达式匹配1次或意多次,至少1次,相当于{1,}
? 表达式匹配0次或1次,相当于{0,1}“ab?”可以匹配“a”或“ab”

5.正则里面的括号

表达式 说明
[]

里面内容表示该位置可能出现的字符,

[ab] 相当于该位置可能出现字符"a"或字符"b"

[0-9]表示该位置出现的字符为0到9之间,包含0,9

{} 里面指定匹配字符的数量,d{6}表示匹配6个数字,比如201212
()

表示分组,这里面的内容是一个整体,这个里面是一个子表达式

(ab){2}表示匹配含有abab的字符串

6 .分支结构

当一个字符串的某一子串具有多种可能时,采用分支结构来匹配,“|”表示多个子表达式之间“或”的关系,“|”是以()限定范围的,如果在“|”的左右两侧没有()来限定范围,那么它的作用范围即为“|”左右两侧整体。

表达式 说明
| 多个子表达式之间取“或”的关系

举例:

“^aa|b$”在匹配“cccb”时,是可以匹配成功的,匹配的结果是“b”,因为这个表达式表示匹配“^aa”或“b$”,而“b$”在匹配“cccb ”时是可以匹配成功的。

“^(aa|b)$”在区配“cccb”时,是匹配失败的,因为这个表达式表示在“开始”和“结束”位置之间只能是“aa”或“b”,而“cccb”显然是不满足的


在我们熟悉一些基本的正则表达式的语法之后,我们就可以来看大量的例子,来有助于我们理解上面的规则:

例1:

身份证为15位或者18位,15位的全为数字,18位的前17位为数字,最后一位为数字或者大写字母”X“。


与之匹配的正则表达式:(^d{15}$)|(^d{17}([0-9]|X)$)

例2:

字符组中的 - ,如果它紧邻着字符组中的开方括号 [ ,那么它就是普通字符,其他情况下都是元字符

[-09]表示包含三个字符-、0、9的字符组;


而[0-9]是包含0~9这10个字符的字符组。

例3:

手机号码的正则表达代码:

我们知道手机号码,座机拨打长途电话的时候会加一个0开头,比如013277667717,还有以+86开头,+86是中国大陆的国际区号。在我们收到短信的时候,显示的号码就是+86开头,比如+8613277667717,当然也可以没有前面的开头,直接手机号码,手机号一般13开头,15开头还有18开头的11位数字。

之前看到网上有一版是这样的

(0|+86)?(13[0-9]|15[0-356]|18[025-9])d{8};

这是错的,分段的给解释一下:

1.(0|+86)?他表示以0开头或者以+86开头,或者没有这些开头,
2.13[0-9]|15[0-356]|18[025-9]

表示以13开头的第三位可以为0-9,这是对的,但是后面他表示或者以15开头,第三位只能是0到3或5或6,但是我的手机上有157,158,之类开头的手机号码,所以这个是错的。
还有以18开头后面他限制在0、2、5到9,但是我的手机上有181开头的,183开头之类

所以后来我改进如下:

(0|+86)?(1[358])d{9}

然后我运用到js中去,代码如下

<html>
<script>
vars="15923520231";
varreg=/(0|+86)?(1[359])d{9}/;
varss=reg.test(s);
alert(ss);
</script>
</html>

上面的代码运行之后为true是对的,但是你输入如下:

vars="a15923520231a"

运行也是对的,因为我们只是让其匹配字符串中有符合手机格式的数字字符串而已,没有限定其字符串的开头和结尾,这时候就运用的^和$

最后js代码变为:

<html>
<script>
vars="15923520231";
varreg=/^(0|+86)?(1[359])d{9}$/;开头只能以0或+86或13,15,18开头,结尾只能是9为数字
varss=reg.test(s);
alert(ss);
</script>
</html>

例4,座机号码的匹配

在我们这个项目中只限定了为:国际区号-国内区号-号码, 且国际区号的长度不能大于4,国内区号的长度不能大于4,号码的长度不能长于16,所以正则表达式如下:

<html>
<script>
vars="086-021-2312344";
varreg=/d{0,4}-d{0,16}/;
varss=reg.test(s);
alert(ss);
</script>
</html>

但是你会发现有错误,输入如下的也是正确的

vars="12a-021-8989923a"

所以没有限定开头的为数字,结尾为数字,但是我有一个疑问中间的我也没有限定,结果只能输入数字,估计是两个--中间限定死了,只能为数字。

做好变为:

varreg=/^d{0,16}$/;

这样就ok了。

还有排它型字符组这儿就不详细说了。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读