我们的项目中,经常会用遇到即使要判断用户输入的手机号码,电话号码,邮箱的格式是否正确的情况,以防止存入了错误的内容,对用户体验也好,所以熟悉和会使用正则表达式会让我们事半功倍。
说某个字符串匹配某个正则表达式,通常是指这个字符串里有一部分(或几部分分别)能满足表达式给出的条件。
在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。
学习正则表达式,必须熟记其中的一些规则,对于一些简单且常用的规则,一定是要熟记的,这样看到复杂的正则表达式,我们就能以不变应万变。
常用的规则
1.范围
表达式 | 说明 |
\w | 任意一个字母或数字或下划线,相当于[a-zA-Z0-9_] |
\s | 任意空白字符,相当于[ \r\n\f\t\v] |
\d | 任意一个数字,相当于[0-9],即0~9 中的任意一个 |
\W | \w取反,相当于[^a-zA-Z0-9_] |
\S | 任意非空白字符,\s取反,相当于[^ \r\n\f\t\v],还有空格 |
\D | 任意一个非数字字符,\d取反,相当于[^0-9] |
例如:
“\w\s\d”在匹配“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}”相当于“\d\d\d ”“(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了。
还有排它型字符组这儿就不详细说了。
原文链接:https://www.f2er.com/regex/360291.html