正则是一个让人感觉十分脑疼但是却又十分有用的东西,其实了解了正则之后,你就会觉得正则其实是一个很简单的东西。接下来我们就来了解一下正则。
注:接下来的一切代码都是JAVASCRIPT代码,如果想练手,直接打开console即可
正则是干什么用的,在这里我想大家都应该知道知道,假如不知道请自行百度,这里就不做讲解。
1.正则的基本形式:
正则表达式的表达形式如下:
/具体的正则表达式/ /**这就是一个正则表达式,使用正则的时候,需要将正则表达式包裹在一对"//"之间**/
正则表达式是由普通字符与特殊字符(元字符)组成的文字模式。
普通字符就是如同“a,b”等常用的单个字符,而元字符则是带有特殊含义的特定字符,这些元字符扩大了正则表达的意思,是之可以匹配很多东西。
/a/
如上就是一个正则表达式,它只包含一个a字符,所以它只能匹配单个a
例如 caat
'caat'.match(/a/)//返回结果是 :['a']
假如我们想匹配caat中两个a怎么办?
'caat'.match(/aa/)//返回结果是 :['aa']
这样也可以,但是加入 c 与 t 之间的a是不确定的,我们想匹配不确定数量的a呢?
'caaaaaaat'.match(/a+/);
这样就行了,这时我们使用了元字符“+”。
没有元字符的正则只能适应简单的场景,而元字符给了正则更为广阔的天空。
下面我来介绍一下元字符。
(我自己将元字符分为如下几种:位置元字符,数量元字符,特殊含义元字符,集合元字符,逻辑元字符,匹配项元字符。上面的分类都是自己想出来的。)
注:没有数量元字符修饰的,都是匹配单个字符。另外没有全局模式,他们都是一遇到符合的就会返回,不会继续匹配剩下的
补充:模式
g:全局模式 即正则将应用于整个字符串,并非在发现第一个匹配时就立即返回
i:不区分大小写
m:多行模式
1.位置元字符
^
:表示从一开始的位置进行匹配,可理解为是否按照^后面字符的开头(需要匹配的表达式跟在^后面)
'cat'.match(/a/);//它会匹配cat中间的a
'cat'.match(/^a/);//返回null,因为它的含义是匹配以a为起始位置的项,cat是以c开头,而不是a所以匹配不到
$
:匹配输入的结束,可以理解为是否以$前面的字符进行结尾(需要匹配的表达式跟在$前面)
'cat'.match(/t$/)//返回['t'],因为cat是以t字母结尾的
'cat'.match(/a$/)//返回null,因为cat是以t字母结尾的而不是‘a’
2.数量元字符
*
:匹配前面一个表达式出现0次或者多次
'caaaaat'.match(/a*/)//返回[""]因为它表示a出现0次或者多次,0次当然就是""。
'caaaaat'.match(/ca*/)//返回["caaaaa"] /ca*/的意思是c字母与0次或多次a的结合体,在'caaaaat'中这样的结合体就是"caaaaa"
//ca* --> 'c'+ n个a的结合 (n是非负整数)(因为它的贪婪模式,所以会尽可能多的去匹配a)
'ct'.match(/ca*/) //返回["c"] 因为没有a所以只能n==0
+
:匹配前面一个表达式出现1次或者多次
?
:匹配前面一个表达式0次或者1次。添加在“*”“+”后面则是表示,尽可匹配尽可能少的字符
注:“*”“+”是尽可能多的匹配,所以他们是贪婪的,而“?”则是尽可能少的,所以它是非贪的.
贪婪的意思就是尽可能把最多的字符返回给你
{n}
:n是一个非负整数,表示匹配前面一个表达式正好出现n次
'caaaaat'.match(/ca{1}/g)//返回["ca"] 它的意思就是c字母与出现一次的a字母的结合
// ca{1} --> ca ca{2} --> caa ca{3} --> caaa ca{n} --> c[n个a]
{n,m}
:匹配前面一个表达式至少出现n次 之多出现m次
3.特殊含义元字符
.
:(单个点)匹配除换行符外的单个字符
[\b]
:匹配一个退格
\b
:匹配一个词的边界(词与空格间的位置)
\B
:匹配非词的边界
\cX
:X只能表示A-Z或者a-z中的任意,表示匹配Control-X
\d
:匹配一个数字
\D
:匹配一个非数字
\f
:匹配一个换页符
\n
:匹配一个换行符
\r
:匹配一个回车符
\s
:匹配一个空白符(空格,制表,换页,换行等)
\S
:匹配一个非空白符
\t
:水平制表
\v
:垂直制表
\w
:匹配一个单字字符(字母,数字,下划线)
\W
:非单字字符
\0
:匹配NULL字符 (C语言中:’\0’ 是字符串的结束符,任何字符串之后都会自动加上’\0’)
4.集合元字符
(x)
:x为一个匹配表达式 匹配括号里面的正则表达式 并进行分组 也就是说它可以重复使用,无需重新书写。一般与 \n (n为正整数)一起使用
'catabacabacata'.match(/(ab)(ac)/);//返回["abac", "ab", "ac"]
'catabacabacata'.match(/(ab)(ac)\1\2/);//返回["abacabac", "ab", "ac"]
// \1 表示的是 (ab) \2 表示的是 (ac)
(?:x)
:不记住分组,无法重复使用
x(?=y)
:匹配x,但x后必须有y才会被匹配
x(?!y)
:匹配x,但x后必须没有y才会被匹配
[x]
:(x为多个字符)匹配中括号内部字符的任意一个字符
[0-9]等价于\d [0-9A-Za-z_]等价于\w
[^x]
:匹配非括号内部字符的任意一个字符
[^0-9]等价于\D [^0-9A-Za-z_]等价于\W