正则表达式具有特殊含义的标点符号
^ $ . * + ? = ! : | \ / ( ) [ ] { }
想直接使用上面这些标点符号直接量,则必须使用前缀 \ 。
正则表达式的字符类
字符 | 匹配 |
---|---|
[...] |
方括号内的任意字符 |
[^...] |
不在方括号内的任意字符 |
. |
除换行符和其他Unicode行终止符之外的任意字符 |
\w |
任何ASCⅡ字符组成的单词,等价于[a-zA-Z0-9] |
\W |
任何不是ASCⅡ字符组成的单词,等价于[^a-zA-Z0-9] |
\s |
任何Unicode空白符 |
\S |
任何非Unicode空白符的字符,注意\w和\S不同 |
\d |
任何ASCⅡ数字,等价于[0-9] |
\D |
除了ASCⅡ数字之外的任何字符,等价于[^0-9] |
\b |
退格直接量 |
正则表达式的重复字符语法
字符 | 含义 |
---|---|
{n,m} |
匹配前一项至少n次,至多m次 |
{n,} |
匹配前一项n次或更多次 |
{n} |
匹配前一项n次 |
? |
匹配前一项0次或1次,也就是说前一项是可选的,等价于{0,1} |
+ |
匹配前一项1次或多次,等价于{1,} |
* |
匹配前一项0次或多次,等价于{0,} |
正则表达式中的锚字符
字符 | 含义 |
---|---|
^ |
匹配字符串的开头,在多行检索中,匹配一行的开头 |
$ |
匹配字符串的结尾,在多行检索中,匹配一行的结尾 |
\b |
匹配一个单词的边界,简言之,就是位于字符\w 和\W 之间的位置,或位于字符\w 和字符串的开头或者结尾之间的位置(但需要注意,[\b] 匹配的是退格符) |
\B |
匹配非单词边界的位置 |
(?=p) |
零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符 |
(?!p) |
零宽负向先行断言,要求接下来的字符不与p匹配 |
\b
:匹配的是单词,而不是单词中的某个部分。并且它只会匹配字符串开头结尾及空格回车等的位置,不会匹配空格符本身。
比如在句子I like bike
中,有很多的i
,我只想匹配I
这个独立的单词,那么需要使用\bI\b
。注意\sI\s
匹配的是I
(单词前后有空格)。
先行断言
:如果在符号(?=
和)
之间加入一个表达式,他就是一个先行断言,用以说明圆括号内的表达式必须正确匹配,但不是真正意义上的匹配。比如,要匹配一种常用的程序设计语言的名字,但只在其后有冒号时才匹配,可以使用/[Jj]ava([Ss]cript)?(?=\:)/
,这个正则表达式可以匹配”JavaScript: The Definitive Guide”中的”JavaScript”,但是不能匹配”Java in a Nutshell” 中的”Java”,因为它后面没有冒号。
用于模式匹配的String方法(4种)
search()
、replace()
、match()
、split()
密码验证:包含大小写字母,数字,特殊字符
以上类别都包含
/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)(?=.*?[#@*&.]).*$/
如果是要求包含且只包含
/^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)(?=.*?[#@*&.])[a-zA-Z\d#@*&.]*$/
正则提取字符
假定我们正在检索的模式是一个或多个小写字母后面跟随了一位或多位数字,则可以使用模式/[a-z]+\d+/。但假定我们
真正关心的是每个匹配尾部的数字,那么如果将模式的数字部分放到括号中(/[a-z]+(\d+)/),就可以从检索
到的匹配中抽取数字了。
var str='translate(12.5,32.1)';
var _str=str.match(/translate\((.*)\)/);
console.log(_str);
RegExp的方法
- exec()
exec()
方法对一个指定的字符串执行一个正则表达式。就是在一个字符串中执行匹配检索,如果没有找到任何匹配,它就返回null,但如果它找到了一个匹配,它将返回一个数组。exec()方法与String方法match()
相似,只是RegExp方法的参数是一个字符串
,而String方法的参数是一个RegExp
对象。
- test()
参数是一个字符串,用test()对某个字符串进行检测,如果包含正则表达式的一个匹配结果,则返回true。
使用案例
后台传回来时间格式的字符串为
2018-01-25 15:19:12.532
,我们要转换成时间对象,本地使用Date.parse()
去转换带有毫秒的字符串貌似会在ie
内核浏览器上转换出错。不使用正则表达式:
1
2var str=`2018-01-25 15:19:12.532`;
var objDate=Date.parse(str.replace(/-/g,'/').split('.')[0]);使用正则表达式:
1
2
3var str=`2018-01-25 15:19:12.532`;
// \s表示任何的Unicode空白符,\S表示任何非Unicode空白符,[...]表示方括号内的任意字符,*表示匹配前一项0次或者多次
var objDate=Date.parse(str.replace(/-/g,'/').replace(/\.[\s\S]*/g,''));