[技术学习]js正则表达式汇总
一、常用正则表达式关键字
".":任意字符 "*":任意个数 "+":任意个数,至少一个 "?":0-1个 "\d":任意个数数字,至少一个 digit "\w":任意数字字母,下划线 word "\s":任意空白,空格,tab,换行符,至少一个 space \:转义符 []:匹配一些字符 -:例如0-5,从几到几 ^:任意的非字符 \S:所有非空白 {4}:字符出现次数等4 {2,4}:字符出现2-4次 {2,}:至少2个 $:字符串的边界 \b:单词的边界,前边界或者后边界 ^和$一起使用,是匹配最初和最后 (|)正则表达式分组 \1反向引用,正则表达式记住的部分 (?=\s) 断言的语法,匹配左侧或者右侧,符合条件的
二、js中正则表达式使用的常用语法:
上述例子为正则表达式的一种常用方式,正则表达式在js中主要使用场景为:
1、test:校验字符串是否符合要求格式,主要在验证时候使用,关键字为pattern.test(str),返回结果为true,或者false
var pattern=/^\d+$/; //定义正则表达式 var str=123; //定义字符串 alert(pattern.test(str)) //使用正则表达式校验字符串
2、exec:获取字符串中与正则表达式匹配的内容
var pattern=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/; //正则表达式,匹配以空格开始,带有<>标签的内容 var str=' <aa> #ab' //测试字符串 alert(pattern.exec(str)) ;//<aa> #ab,<ab>,
根据()进行分组,匹配结果为一个数组a[],a[0]为最长匹配到的字符串,a[1]为第一个数组,a[2]为第二个小括号匹配的内容,依次类推,如果某个小括号内的匹配不显示到数组中,需要加?:进行过滤,具体含义参考?:的用法。
3、replace:对数据进行局部或者全局替换
var str='8google8 8google8 8google8'; var pattern=/8(.*)8/; //贪婪模式,匹配到的为整个字符串 <strong>google8 8google8 8google</strong> var pattern=/8(.*?)8/; //非贪婪模式,替换结果为<strong>google</strong> 8google8 8google8 var pattern=/8(.*?)8/g; //非贪婪模式,g表示全局替换,结果为<strong>google</strong> <strong>google</strong> <strong>google</strong> alert(str.replace(pattern,'<strong>$1</strong>'));
将字符串匹配部分替换为为指定的字符串,其中可以根据分组,使用$1..保留源字符串的部分内容。
4、match,与exec使用方法类似,不过exec是正则的方法,match是str的方法,因此使用上为str.match(pattern),其他区别如下例子:
var str='once two three'; var pattern=/\S+/g;//全局匹配的正则 alert(str.match(pattern))//结果为一个数组,one,two,three alert(pattern.exec(str))//匹配结果为one
5、search,使用
/*使用search 来查找匹配数据*/ var pattern = /box/ig; var str = 'This is a Box!,That is a Box too'; alert(str.search(pattern)); //查找到返回位置,否则返回-1
6、split
/*使用split 拆分成字符串数组*/ var pattern = / /ig; var str = 'This is a Box!,That is a Box too'; alert(str.split(pattern)); //将空格拆开分组成数组
三、几个重要概念
1、贪婪模式和非贪婪模式
在正则表达式匹配过程中,默认匹配最多的字段,例如以/8.*8/进行匹配'8google8 8google8 8google8',由于.*可以匹配任意字符串,所以默认为以收尾为8除去后,匹配尽可能多的要素,所以结果为'8google8 8google8 8google8',如果要改为遇到第一个8就截止,则需要改为/8.*?8/,表示不贪婪,匹配结果为8google8。
在设计模式中类比单例模式的饿汉模式和懒汉模式,饿汉就是很饥饿,尽可能多的需要食物,懒汉就是直到需要的时候,才去申请食物。
2、锚字符
在正则表达式有些特殊字符,有具体的含义
^:表示此次匹配必须从行首开始匹配
$:此次匹配的结尾必须与行尾匹配
\b:匹配字符串边界,以下表达式可以匹配'google aaa',但无法匹配’googleaaa'
var str= "google aaa" ; var pattern=/google\b/ alert(pattern.test(str))
3、正则表达式分组概念
在正则表达式中,可以使用()进行分组,分组在exec,match等函数中会返回匹配到的整个字符串和分组的情况,使用$1或者\1等可以获取某个指定分组
4、可选修饰词 /\w/igm
i 忽略大小写
g 全局匹配
m 多行匹配
5、问号"?"的使用,问号作为正则表达式特殊字符有以下几种使用方法:
5.1:当做真实问号使用 \?
5.2:表示0次或1次 \w? 表示0-1次字符
5.3:表示非贪婪模式, \w*? 表示非贪婪的匹配任意多个字符
5.4:表示非捕获?:,goo(?:.*)8 使用exec等捕获时.*内容不会作为单独分组
5.5 表示前瞻捕获?= goo(?=gle) //goo 后面必须跟着gle 才能捕获
举一个极端的例子
var str= "gaoo?gle aaa" ; var pattern=/(?:ga??oo\?(?=gle))/ //此正则中有五个问号,含义各不相同:1、整个分组不会被捕捉,2、表示g后又0个或者1个a,3表示对a采用非贪婪匹配4、表示匹配实际的?号,5表示整个匹配获取必须以gle结尾,但又不包括gle alert(pattern.exec(str)) //匹配结果:gaoo?