JS—正则表达式
正则表达式的元字符是包含特殊含义的字符,它们有一些特殊的功能,可以控制匹配模式的方式,反斜杠后的元字符失去其特殊含义。
- 单个字符和数字
.
表示匹配除换行符外的单个字符,两个.
就表示匹配两个字符var pattern1=/g.gle/; alert(pattern1.test('gogle'))//true alert(pattern1.test('g\ngle'))//换行符false alert(pattern1.test('ggle'))//没有匹配false var pattern2=/g..gle/; alert(pattern2.test('google'))//true alert(pattern2.test('gooogle'))//false
[a-z0-9A-Z]
[a-z]
表示26个小写字母任意一个都匹配var pattern1=/[a-z]oogle/; alert(pattern1.test('hoogle'))//true alert(pattern1.test('google'))//true
[A-Z]
表示26个大写字母任意一个都匹配var pattern1=/[A-Z]oogle/; alert(pattern1.test('Aoogle'))//true alert(pattern1.test('google'))//false
[0-9]
表示0-9任意一个数字都匹配var pattern1=/[0-9]oogle/; alert(pattern1.test('000000oogle'))//true alert(pattern1.test('google'))//flase
[a-zA-Z0-9]
表示匹配任意字母与数字
【结合重复字符使用】表示可以匹配任意多个字符var pattern1=/[a-zA-Z0-9]oogle/; alert(pattern1.test('0oogle'))//true alert(pattern1.test('google'))//true alert(pattern1.test('Foogle'))//true
var pattern1=/[0-9]*oogle/; alert(pattern1.test('oogle'))//true alert(pattern1.test('00000google'))//true
[^a-z]
表示取非,任意非小写字母
当然也可以是任意非大写字母,非数字,非~var pattern1=/[^a-z]oogle/; alert(pattern1.test('0oogle'))//true alert(pattern1.test('google'))//flase alert(pattern1.test('Foogle'))//true
\w小写
表示匹配字母数字及_var pattern1=/[a-zA-Z0-9_]oogle/;//可以被后者取代 var pattern2=/\woogle/; alert(pattern2.test('_oogle'))//true alert(pattern2.test('.oogle'))//false
\W大写
是小写的否定即,表示匹配任意非数字字母下划线\d
匹配数字var pattern1=/[0-9]oogle/; var pattern2=/\doogle/; alert(pattern2.test('2oogle'))//true alert(pattern2.test('.oogle'))//false
\D
大写取非咯
-
空白字符
\s
表示空白匹配var pattern1=/goo\sgle/; alert(pattern1.test('goo gle'))//true
-
锚字符
^[]
放在中括号外面哦,表示限制中括号内的内容出现在字符串的开始,[]$
表示限制中括号的内容,或紧邻其的一个字符需要出现在字符串的结尾var pattern1=/^google$/; alert(pattern1.test('google'))//true var pattern2=/^google/; alert(pattern2.test('googleeeeee'))//true var pattern3=/google$/; alert(pattern3.test('gggggoogle'))//true var pattern1=/^google[0-9]$/; alert(pattern1.test('google7777'))//false alert(pattern1.test('google7'))//true
\b
表示是否达到边界var pattern1=/google\b/; alert(pattern1.test('google'))//true var pattern1=/google\b/; alert(pattern1.test('googlee'))//flase
- 重复字符
*
表示匹配0个或任意多个*前面的字符var pattern1=/go*gle/; alert(pattern1.test('ggle'))//true alert(pattern1.test('gogle'))//true alert(pattern1.test('gooogle'))//true
+
表示匹配1个或多个+前面的字符var pattern1=/go+gle/; alert(pattern1.test('ggle'))//false alert(pattern1.test('gogle'))//true alert(pattern1.test('gooogle'))//true
?
表示匹配0个或一个?前面的字符
这个是表示对任意字符的重复限制。var pattern1=/go?gle/; alert(pattern1.test('ggle'))//true alert(pattern1.test('gogle'))//true alert(pattern1.test('gooogle'))//false
var pattern1=/g.?gle/; alert(pattern1.test('ggle'))//true alert(pattern1.test('gbgle'))//true
{m,n}
匹配m~n个包括m与n个
表示只匹配限定个数个var pattern1=/go{2,4}gle/; alert(pattern1.test('gooooogle'))//false alert(pattern1.test('google'))//true
表示至少匹配某个var pattern1=/go{2}gle/; alert(pattern1.test('gooooogle'))//false alert(pattern1.test('google'))//true
var pattern1=/go{2,}gle/; alert(pattern1.test('gooooogle'))//true alert(pattern1.test('google'))//true
()+匹配至少一个模式
var pattern1=/(google)+/;//对google这个字符串进行重复匹配 alert(pattern1.test('googlegooglegoogle'))//true
- 或字符
或模式匹配var pattern1=/google|baidu|bing/;//或模式匹配 alert(pattern1.test('this is baidu'))//true alert(pattern1.test('soso'))//false
- 替代字符
var pattern1=/(.*)\s(.*)/;//替换 var str='google baidu'; alert(str.replace(pattern1,'$2 $1'));//baidu google var pattern1=/8(.*)8/;//获取88之间的任意字符 var str='this is 8google8'; document.write(str.replace(pattern1,'<strong>$1</strong>'))
- 记录字符
- 分组
var pattern1=/(google){2,4}/;//对google这个字符串进行重复匹配 alert(pattern1.test('googlegooglegoogle'))//true alert(pattern1.test('google'))//flase
- 捕获分组
var pattern1=/8(.*)8/;//获取88之间的任意字符 alert(pattern1.test('this is 8google8'))//true alert(RegExp.$1);//google表示获取模式中第一个分组对应的匹配的字符串,必须得运行过。
- 分组
贪婪与惰性
- 贪婪模式
var pattern=/8(.*)8/;// 使用了贪婪,匹配到了google8 8google8 8google var str='8google8 8google8 8google8'; document.write(str.replace(pattern,'<strong>$1</strong>'))
- 惰性模式
在*后面多加一个?表示取消贪婪模式,进行惰性模式,只进行匹配一个。var pattern=/8(.*?)8/g;//惰性模式,全部匹配 var str='8google8 8google8 8google8'; document.write(str.replace(pattern,'<strong>$1</strong>'))
下面这个是没有采用惰性模式,只是将匹配的结果中除去了8var pattern=/8([^8]*)8/g;//惰性模式,全部匹配 var str='8google8 8google8 8google8'; document.write(str.replace(pattern,'<strong>$1</strong>'))
- 捕获与非捕获
未添加分组时:.exec只返回当前位置匹配的字符串
添加分组后,该分组内容被捕获,并赋给exec所返回的数组var pattern=/[a-z]*\s\d{4}/; var str='google 2015'; alert(pattern.exec(str));//google 2015
非捕获即取消分组被捕获var pattern=/([a-z]*)\s(\d{4})/; var str='google 2015'; alert(pattern.exec(str));//google 2015,goole,2015
(?:)
通过在分组前加上问号与冒号,便可以取消捕获该分组。var pattern=/([a-z]*)\s(?:\d{4})/; var str='google 2015'; alert(pattern.exec(str));//google 2015,goole
- 分组嵌套
嵌套分组需要~从外往内获取~
第一步:获得匹配字符串:abcvar pattern=/(a?(b?(c?)))/; var str='abc'; alert(pattern.exec(str));//abc,abc,bc,c
第二步:获得第一个分组,即最外层:abc
第三步:获得第二个分组,bc
第四步:获得最内层分组c - 使用前瞻捕获
在正则匹配的字符串之后添加一对(),该括号内定义了匹配条件,只有当满足条件时,才可以进行匹配。注意该例子的最后匹配值为goo。var pattern=/goo(?=gle)/; var str='google'; alert(pattern.exec(str));//goo
- 使用特殊字符匹配
对于要匹配特殊最的情况,需要在其前加上斜杠,来标识。var pattern=/\[/; var str='['; alert(pattern.test(str));//true
-
换行模式
var pattern=/\d+/g; var str='1、abc\n2、edf'; alert(str.replace(pattern,'#'));//完全匹配,并替换 var pattern=/^\d+/g; var str='1、abc\n2、edf'; alert(str.replace(pattern,'#'));//匹配第一个 var pattern=/^\d+/gm; var str='1、abc\n2、edf'; alert(str.replace(pattern,'#'));//完全匹配,并替换
当字符串内出现换行符时,如果我们不进行锚字符的使用,那么会匹配全局,包括换行后的。
但是,由于使用锚字符,导致即使使用了全局,也没有办法匹配换行后的结果,此时需要开启换行。