正则表达式是对字符串操做的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式
- 正则表达式简写为regex、regexp、REwindows
- 正则表达式经常使用于字符串操做,以及表单的输入验证数组
- 正则表达式是用某种模式去匹配一类字符串的公式,是一种强大的字符串匹配工具浏览器
- 正则表达式能够理解为生产流水线上一种标准的格式规范,做为一个标准的模具,当须要被验证的字符串符合这种格式规范就会经过检验,不符合则被过滤掉工具
正则表达式的定义有两种: 显式定义、隐式定义学习
显式定义:spa
使用new关键字来定义,其中的正则表达式必须使用引号包裹,还要注意字符串的转义。code
语法: var 变量名 = new RegExp( “ 正则表达式 ” );regexp
var 变量名 = new RegExp( “ 正则表达式 ”,“选项” );
例: var re = new RegExp( “[a-z]” ,”i” );
隐式定义:
不须要new和引号,只须要在表达式先后都加 /
语法: var 变量名 = / 正则表达式 /;
var 变量名 = / 正则表达式 /选项;
例: var re = /[a-z]/i;
*---------------------------------------*
选项(可选):
i : 忽略大小写
g : 全局匹配
gi: 既全局匹配,又忽略大小写
*---------------------------------------*
** 在JS中,正则表达式是由一个RegExp对象表示的,利用RegExp对象来完成有关正则表达式的操做和功能
re.test(str); //用于判断某字符串str是否匹配须要的正则表达式re模式
语法:正则表达式 . test( 字符串 )
若是符合,返回true ;不然返回false
例:
1 var oRe = /\d{6}/; 2 var oStr0 = '666666'; 3 var oStr1 = '332od';
4 alert(oRe.test(oStr0)); //返回true 5 alert(oRe.test(oStr1)); //返回false
a)普通字符
单个出现,前面没有转义符号的的a~z、0~9
普通字符的出现,就意味着待验证的字符串的相同位置必须有相同的普通字符
例:/h[123456]/ 表示h1~h6
b) 元字符
*** 在元字符中,字母大写表示非
好比:\d表示匹配数字, \D表示匹配非数字
1 \d //匹配数字,至关于[0-9] 2 \D //匹配非数字,至关于[^0-9] 3 \w //匹配字母/数字/下划线 4 \W //匹配非(字母/数字/下划线)的字符 5 \s //匹配空白符,包括(空格/换行符/制表符tab) 6 \S //匹配非空白符 7 . //匹配除了换行符之外的字符 8 [ ] //匹配符合方括号里面条件的字符 9 [^ ] //匹配不符合方括号里面条件的字符
** []拓展:
在正则中,[ ] 表示匹配方括号中的任意一个字符就算匹配成功,也能够说,[]就表明一个字符,这个字符符合[]里任一的条件就可
1. [abc]
表示或者:即此处出现而且只出现abc中的一个,只使用其中一个字符,在这里边不须要空格或,等间隔符号
例: / A[abc]B / : 等价于/A(a|b|c)B/,也等价于/ AaB|AbB|AcB /
2. [0-9] / [a-z] / [0-9a-z]
范围:表明从0到9每个数字至关于\d / 从a到z的每个字母 / 全部数字/字母
** []只表示取值范围,取值个数只有一个
**须要注意的是[]里面无论有多少规则,可是在匹配字符串的时候,[]规则对应的只是响应位置上的一位字符的匹配
例:[0-9] 表明数字0到9中的一个
3. [ ^ ]
非 : 除了,
要注意的是,一个[^]是一个总体,表明一个字符,也就是
[ ^abc ] : 意为[ ^a ]、[ ^b ]、[ ^c ],这个字符不能是a,也不能是b,也不能是c
必定不要认为[^ab]等于[^a]或[b],这个是错误的
应用:小说采集器—自定义innerText方法去掉标签,将HTML变成文本
oBtn.onclick = function (){ var re = /<[^<>]+>/g; oTxt2.value = oTxt1.value.replace(re,' '); }
*** 在这里必定要有[ ^<> ],这是为了不因为第一个<和最后一个>致使全部东西都清空,也就是避免<>里面嵌套着标签
c) 链接符
-做为链接符来表示一种范围
1 [0-9] //匹配数字,至关于/d 2 [a-z] //匹配小写字母 3 [A-Z] //匹配大写字母 4 [0-9a-zA-Z] //匹配数字或英文字母
d) 限定符/量词
限定某个或某一类字符出现的次数,当表示一类字符的重复次数的时候,字符之间是连续的,不能被其余字符隔开
1 + //a+ 表示+前一个字符a必须出现至少一次才算匹配成功 (1~)次
2 * //a* 表示*前一个字符*出不出现,出现多少次都行 (0~)次
3 ? //a? 表示a能够出现,也能够不出现,但出现最多出现一次 (0~1)次
4 {n} //a{n} a必须出现n次 (n)次
5 {n,} //a{n,} a至少出现n次 (n~)次
6 {,m} //a{,m} a最多出现m次 (~m)次
7 {n,m} //a{n,m} a至少出现n次,最多m次 (n~m)次
例:
匹配qq号: /1-9\d{5,10}/ ,表示查找一串字符,第一位是1到9中的一个数字,后面跟着5到10个数字
** 要注意的是:限定符限定的字符是连续的,
即 go{2} 能够匹配goo,但不能匹配goao
e) 定位符
定位符用于限定某些字符出现的位置
正则表达式的匹配规则是,只要有一部分符合就算匹配成功,也就是说咱们要匹配一段字符串,这个时候开头和结尾若是多了其余的字符也算匹配成功,因此这时候就用到限定行首行尾,通常用于校验以及去首尾空格的状况
正确的语法是: /^a正则$b/ 这个正则表达式,开头必须是a,结尾必须是b
1 ^ /* /^abc/ 限定开始的字符必须是abc,也就是整个表达式规则对应的字符串部分必须在待验证字符串的开头 */ 2 $ /* /abc$/ 限定结尾的字符必须是abc,也就是整个表达式规则对应的字符串部分必须在待验证字符串的末尾 */ 3 \b /* \b表明这里有一个单词边界 */ 4 \B /* \B表明这里不是单词边界 */
** ^在[]中表明非,在外面就是表明行首
举例:
对于^, /^abc/能够经过的是:abcd,可是dabc是不能够的
对于$, /abc$/能够经过的是:dabc,可是abcd是不能够的
**关于\b和\B
这两个定位符主要用于英文,最经常使用的就是经过/\b...\b/来匹配一个英文单词
*-*单词边界:
所谓的单词边界是单词字母和单词分隔符(通常指空白符)中间位置,也就是说单词边界就表明单词字母和空白符相邻
好比:hello world,咱们使用!表明单词边界来看就是:hello! !world
因此:对于:acb cab bac 来讲
/c\b/ 能够匹配到 bac
/\bc/ 能够匹配到cab
/\b[a-z]c[a-z]\b/ 能够匹配到acb
/\Bc/和/c\B/均可以匹配到acb,由于在单词内部,c的两边都不是边界
f) 转义字符
对于特殊字符:$ ( ) * + . [ ] ? / ^ { } | 在正则表达式中都有特殊的含义,若是想要将他做为原有含义使用,那么都须要进行转义,转义方法为在前面加一个\
若是要转义的特殊字符是\,那么久使用\\
例如:go+中的+表明重复、go\+中通过转义后的+表明就是单纯的+
**特殊的,咱们知道定义一个正则的语法是//包裹
var abc = / \d{6} /;
使用另外一种写法为:
var abc = new RegExp(“\\d{6}”);
** 会发现这里使用的是\\而不是\
其实使用new关键字定义正则表达式,RegExp对象是一个字符串,所以这里必须使用JavaScript的转义字符(不一样于正则表达式转义字符)
g) 分组符
使用()将某部分字符做为一个总体进行操做
对于/[abc]{2}意思是匹配含有abc中任意两个字符组合的字符串
对于/(abc){2}意思是匹配含有abcabc的字符串
h) 选择符
常和分组符配套使用
ab|cd 这样是匹配ab或者cd,
而a(b|c)d匹配的abd或者acd
a) 由字符串操做引入
1.str.search(Str);查找
返回一个数字,这个数字是目标字符串第一次出现的位置
若是字符串不包含目标字符串,就返回-1
2.str.substring(m);剪切
返回从m一直到最后一个字符的一段字符串
str.substring(m,n);剪切
返回从m到n-1的一段字符串
3.str.charAt(m);
返回第m位的字符
4.str.split(Str);
将目标字符串以Str为分隔符切开塞入数组并返回数组
b) 将字符串操做与正则结合
a) str.search(Str);
//该方法不仅能够查找字符串,同时能够查找正则表达式
例:
var re = /\d/;
str.search(re);
**应用:
window.navigator.userAgent 这句话的意思是当前浏览器的种类和版本,里面杂乱的东西不少
这个时候能够经过userAgent配合正则来获取并判断浏览器的类型
b) str.match()
//匹配
** 挑出全部数字
例: var Str = /\d+/g;
alert(str.match(Str));
c) str.replace()
//替换、过滤
str.replace( ‘a’ , ‘T’); //这句话本意是说将a都替换为T,可是这个是有问题的,若是str中的a不止一个,结果被替换的却只有第一个
解决:
str.replace(/a/g , ‘T’);
** 若是咱们忽略大小写,将全部的a/A改成T,那么str.replace(/a/gi , ‘T’);或者str.replace(/a/ig , ‘T’);均可以。
简单实例:敏感词过滤:
1 oBtn.onclick = function (){ 2 var re = /你丫的|你妹的|你大爷的/g; 3 oTxt2.value = oTxt1.value.replace(re,"***"); 4 }
a) 匹配HTML标签
<[a~zA~Z][^>]*>
b) 匹配windows系统的名称
Windows\s*((95)|(98)|(2000)|(ME)|(XP)|(7)|(8)|(10))
d) 校验邮箱
最终:/^ \w+@[a-z0-9]+\.[a-z]{2,4} $/
e) 去首尾空格
/^\s+/ 去掉行首的空格
/\s+$/ 去掉行尾的空格
/^\s+|\s+$/g 去掉行首行尾的空格
f) 匹配中文
/[\u4e00-\u9fa5]/ 全部汉字的范围
g) 完美版getByClass
** 单词边界 \b 使用两个\b包裹的是单独一个完整的单词
1 function getByClass(oParent,sClass){ 2 3 var aEle = oParent.getElementsByTagName('*'); 4 5 var aResult = []; 6 7 var re = new RegExp('\\b'+sClass+'\\b','i'); 8 9 for(var i=0;i<aEle.length;i++){ 10 11 if(re.test(aEle[i].className)){ 12 13 aResult.push(aEle[i]); 14 15 } 16 17 } 18 19 return aResult; 20 21 } 22 23 //例:: 24 //var aTar = getByClass(oUl,'box'); 25 26 //for(var i=0;i<aTar.length;i++){ 27 28 // aTar[i].style.background = 'red'; 29 //}