本文来自《正则表达式必知必会》的总结,因为本人也算才入门,只是分享一下,也给自己做个总结。同时希望更多的人能够理解其中的含义,而不只是上网百度之后直接就拿来用,本来正则没有那么难~以下引自书中的话将使用引用的方式声明。
正则表达式就是用来筛选一些自己想要或者不想要的字符串。比如:手机号、邮箱、身份证等。
正则表达式被简称为模式,他们是有一些字符构成的字符串。这些字符可以是普通字符和元字符。
元字符 .
字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符 |
通过元字符
.
可以匹配除了换行符以外的任意字符。
let reg = /a.c/;
let str = "abc";
reg.test(str) //true
上述例子中的test()
为JavaScript中的RegExp方法,它能够测试字符串中指定的值。返回 true 或 false。
在JavaScript中有两大类方法,分别是RegExp方法和String方法。
- RegExp方法说白了就是以 正则在前,要检索的字符串在括号里。regexp.test(string)
- String方法就是字符串在前,要检索的正则在括号里 string.match(regexp)
那么方法总共有这些:
RegExp方法
方法 | 描述 |
---|---|
exec | 检索字符串中指定的值。返回找到的值,并确定其位置。 |
test | 检索字符串中指定的值。返回找到的值,并确定其位置。 |
String方法
方法 | 描述 |
---|---|
search | 检索与正则表达式相匹配的值。 |
match | 找到一个或多个正则表达式的匹配。 |
replace | 替换与正则表达式匹配的子串。 |
split | 把字符串分割为字符串数组。 |
使用[]
来匹配字符集合。
let reg = /[ns]a/;
let str = "na";
let str2 = "sa";
reg.test(str) //true
reg.test(str2) //true
验证某个模式能不能获取预期的匹配结果并不难,但验证它不会匹配到你不想要的东西可就没那么困难了。
我只想匹配na或者sa
,结果却把其他的也给匹配进来了。
let reg = /[ns]a/;
let str = "cna";
reg.test(str) //true
[0-9]
能够匹配0123456789
,也就是说/[0-9]/
与/[0123456789]/
等价,其他的还有/[A-Z]/
/ /[a-z]/
等。
在实际工作中,最常用的字符区间还是数字字符区间和字母字符区间
^
元字符,本意是匹配以^开头的字符
let reg = /^[0-9]/;
let str = "1n";
reg.test(str) //true
let reg = /^[0-9]/;
let str = "n1";
reg.test(str) //false
但是放在[]
集合里,意思为取反。[^x] 匹配除了x以外的任意字符
let reg = /[^0-9]/;
let str = "n";
reg.test(str) //true
let reg = /[^0-9]/;
let str = "1";
reg.test(str) //false
以上做个总结:
元字符
[]
用来定义一个集合,含义是必须匹配这个集合里面的任意字符之一。
. 在[]
集合里面放入^
意为取非。这将把给定的字符集合排除在外。
/[^0-9]/
的意思为,除了0到9之外的都将匹配
元字符代表匹配某一类别的字符
- 数字类别
元字符 | 描述 |
---|---|
\d | 任何一个数字字符(等价于[0-9]) |
\D | 任何一个非数字字符(等价于[^0-9]) |
let reg = /marry\[[\d][\d]\]/; //匹配 marry[xx] xx为两个数字 \为转义符
let str = "marry[15]";
reg.test(str) // true
let reg = /marry\[[\d][\D]\]/;
let str = "marry[15]";
reg.test(str); // false
let reg = /marry\[[\D][\D]\]/;
let str = "marry[ab]";
reg.test(str); // true
- 字母数字类别
元字符 | 说 明 |
---|---|
\w | 任何一个字母和数字字符(大小写均可)或下划线字符(等价于[a-zA-Z0-9_]) |
\W | 任何一个非字母和数字字符或非下划线(等价于[^a-zA-Z0-9_]) |
- 空白字符
元字符 | 说 明 |
---|---|
\s | 任何一个空白字符(等价于[\f\n\r\t\v]) |
\S | 任何一个非空白字符(等价于[^\f\n\r\t\v]) |
元字符 +
元字符 | 说 明 |
---|---|
+ | 匹配1个或多个字符 |
该元字符能够匹配最少一个,最多N个字符。
如果要匹配邮箱,就需要使用+。如下:
let reg = /\w+@\w+\.\w+/; //使用转义符对.进行转义
let str = "text@test.com"
reg.test(str) //true
这样可以简单的匹配一个常见邮箱。如果严谨点,可以如下设置:
let reg = /[\w\.]+@[\w\.]+\.\w+/
这样可以多匹配几个.来控制地址。
元字符*
元字符 | 说 明 |
---|---|
* | 匹配0个或多个字符 |
let reg = /\w+[\w\.]*@[\w\.]+\.\w+/
let str = "text@test.com"
reg.test(str) //true
相比上面开头少了匹配.
和后面添加了一个[\w\.]*
,这样设置可以控制text.
后面和@
前面这段是否出现。因为使用*
可以匹配0个或者多个。
*与+的区别是:+匹配一个或多个字符,最少要匹配一次;*匹配零个或任意多个字符,可以没有匹配。
元字符?
元字符 | 说 明 |
---|---|
? | 匹配0次或1次 |
比如:
let reg = /http:\/\/[\w./]+/ //这里想要匹配 http://, 但是需要对//进行转义,因此写成 \/\/
let str = "http://www.baidu.com"
reg.test(str) //true
如上只能匹配http开头的,如果想要匹配https,可以这样设置
let reg = /https?:\/\/[\w./]+/
使用{}
可以定义精确的范围
如上几个元字符*+
能够匹配一些不确定的字符,我们没法精确控制个数。那么使用{}
可以精确的控制个数
元字符 | 说 明 |
---|---|
{} | 精确的控制个数 |
let reg = /\w{5}.\w{3}/
let str = "baidu.com"
reg.test(str) //true
为重复匹配设定一个区间
也就是说,在{}
这样的基础上,填入几就是控制几个字符。如果填入{2,5}
这样的话,就是最少出现2次,最多出现5次。
最少匹配几次,或多次
{3, }
这样设置就是最少出现3次,或多次。
元字符\b
元字符 | 说 明 |
---|---|
\b | 用来规定边界 |
let reg = /cat/
let str = "cat cation"
reg.test(str) //true
如上代码想要匹配 cat 这个单词,但是例子中两个都能够匹配上。所以想要单独只匹配 cat 的话,需要使用边界符
let reg = /\bcat\b/
let str = "cat"
reg.test(str) //true
let reg = /\bcat\b/
let str = "cation"
reg.test(str) //false
另外两个常用的匹配边界^ and $
^
匹配字符串的开头,如:
let reg = /^\d/
let str1 = "1234"
let str2 = "a1234"
reg.test(str1) // true
reg.test(str2) // false
相应的,$匹配字符串的结尾。如:
//我们把字母换个位置
let reg = /\d$/
let str1 = "1234"
let str2 = "1234a"
reg.test(str1) // true
reg.test(str2) // false
元字符|
|
表示或,如:
let reg = /19|20/;
let str = "1937";
reg.test(str) //true
//把1937换成2018,同样返回true
let reg = /19|20/;
let str = "2018";
reg.test(str) // true
以上就是比较常见的正则表达式符号了,还有其他的比如说:()
匹配模式、回溯引用和向前查找等,这里就不在说了,感兴趣的同学可以买下《正则表达式必知必会》看看,还是挺好的。最后我感觉作者的一句话非常好。同时也是最重要的:
验证某个模式能不能获得预期的匹配结果并不困难,但如何验证它不会匹配到你不想要的东西可就没那么简单了。