每种编程语言里都有正则表达式,而且内容基本上都是一样的,今天就来说说我对正则表达式的理解。
我觉得正则表达式实际上就是一种规则,一种针对字符串的规则,我们可以通过正则表达式来获取我们想要的同类型字符串或者检验某一字符串是否符合我们的要求。
正则表达式可以参与计算的符号有:
(),小括号,或叫圆括号,是一个分组,也是个集合。他的作用是一个匹配一串字符。比如:
/(abc)/; 该句的作用是匹配源字符串中是否有"abc"这样的一串字符;
[],中括号,或叫方括号,是一个集合,他的作用是匹配集合中的其中一个字符。比如:
/[abc]/; 该句的作用是匹配源字符串中是否有"a"或者"b"或者"c"中的其中一个。
{},大括号,或叫花括号,是一个数量范围,他的作用是匹配某串字符是否有N个,不能直接使用,需要和其他能代表字符的表达式配合使用。他有三种用法:
{1} 匹配一次,{1,} 匹配最少一次,最多不限,{1,5} 匹配最少一次,最多5次。比如:
/[abc]{2}/ 这句的意思是abc其中的一个是否连续出现2次,就是匹配源字符串中是否有aa 或bb 或cc;
/[abc]{2,}/ 这句的意思是abc其中的一个是否最少连续出现2次。
/[abc]{2,5}/ 这句的意思是abc其中的一个是否最少连续出现2次,最多出现5次。
其实这里有个坑:
let a = /[abc]{2,5}/; let b = ‘aaaaaa’; console.log(a.test(b));//结果为true
为什么6个a也能匹配成功?我的理解是:匹配是检索源字符串中的其中一串是否符合正则,意思就是6个a中肯定有连续的2-5个a,所以能匹配成功。这个坑先记下,讲到后面的符号时再来破他。
\,反斜杠,是转义符,意思是反斜杠后面将要用到的字符不是表面上看起来那样的意思,这句话有点绕,看例子就能明白了:
/\(/ 小括号在正则中的意思是分组,但用反斜杠标注之后,那他的意思就不是表面上分组的意思了,那是什么意思?意思是他就是个左小括号。再来个例子就能更明白点:
/\d/; d在正则中表面上是一个字符,但用反斜杠标注之后,他就不是个字符了,就代表所有的数字。
^ ,这个符号暂时没有中文名字,英文名字叫caret,他有两个作用,在表达式的开头写上他,代表字符串的开头,写到集合中,就代表非,就是不能有集合中的字符。还是例子能说明事儿:
/^a/; 这句的意思是要匹配的字符串的第一个字符必须是a;
let a=/^a/; let b = "abc"; let c = "bacd"; console.log(a.test(b));//true; b字符串开头第一个字符是a,所以能匹配成功。 console.log(a.test(c));//false; c字符串开头第一个字符不是a,所以匹配失败。
$, 美元符号,作用是匹配字符串的结尾,和 ^ 的效果一样,位置相反,直接看例子:
let a=/a$/; let b = "bca"; let c = "cad"; console.log(a.test(b));//true; b字符串最后一个字符是a,所以能匹配成功。 console.log(a.test(c));//false; c字符串最后一个字符不是a,所以匹配失败。
| 竖线, 或 的意思,和代码里常用的 || 用法一模一样,就不再多说了。
? ,问号,量词,和{}用法一样,意思是匹配0次到1次。效果等同{0,1};
* ,星号,量词,和{}用法一样,意思是匹配0次到N次。效果等同{0,};
+ , 加号,量词,和{}用法一样,意思是匹配1次到N次。效果等同{1,};
. , 点号,不是量词,意思是可以匹配任意一个字符。
另外还有一些转义用法:
\d 代表任意一个数字 效果等同[0-9];
\D 代表任意一个不是数字的字符,效果等同[^0-9];
\w 代表任意一个字母、数字、_ (下划线)、汉字。 功能很强大。
\W 代表任意一个不是字母、数字、_ (下划线)、汉字的字符。
等等,不过那些一般情况下用不到,这里就不详细说了。
下面要说一下正则表达式的模式:
g,全局模式,意思是要把源字符串从头到尾匹配一遍,不论中间是否匹配成功,如果不加 g模式,那么匹配成功一次之后就不再向后匹配了。
i,不区分大小写模式,这个很明了,不用细说。
m,多行模式
下面找几个例子来拆解一下应该能更容易明白:
网上找的一个邮箱的正则表达式: /^[\w]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/g;
来我们解读一遍,
^ [\w] + ( \. [\w-] + )* @ [\w-] +
开头[任一字XX]最少一次 (点号 [任一字XX或-]最少一次)不限次 @[任一字XX或-]最少一次
(\. [\w-] + ) + $
(点号 [任一字XX或-]最少一次)最少一次 结尾
这样能看懂么?看不懂?那就按他的规则写一个字符串看看是不是邮箱的格式吧
^ [\w] + ( \. [\w-] + )* @ [\w-] +
开头[任一字XX]最少一次 (点号 [任一字XX或-]最少一次)不限次 @[任一字XX或-]最少一次
这是拼接的: a3_ .b23g @ abc
(\. [\w-] + ) + $
(点号 [任一字XX或-]最少一次)最少一次 结尾
. ab4 .ab4.ab4
好了,连起来看就是:a3_.b23g@abc.ab4.ab4.ab4 哇,真是邮箱的格式,不过里面用了很多\w,我还还真没见过用汉字的邮箱 和汉字的域名后缀,所以我们可以来改造一下,让这个更符合我们现在的常见情况:
/^[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)*@[a-zA-Z0-9_]+(\.[a-zA-Z0-9_]+)+$/g;
恩,因为\w是可以代表数字、字母、_和汉字,我们不要汉字 ,那就写成了 [a-zA-Z0-9_]
好的,再拼一下,那就是[email protected] ; 跟我们常见的邮箱一样了吧。个人感觉这一整篇文章也就最后这段的拆解法写正则能对某些同学会有帮助了。最重要还是要多练习。