正则表达式
正则表达式 / 正则表达式是个神马玩意儿
正则表达式都是操作字符串的,模式就是规则,匹配就是作比较。
正则表达式由以下两种字符组成的文字模式:
1,普通字符(26个英文字母,数字)
2,特殊字符(有特殊含义的,例如./等) 匹配一个或多个字符串。
使用正则的理由:
方便查找。还可替换。数据有效性验证(表单)。
正则表达式 /初识正则表达式
字面量或直接量方式创建:/正则内容/
构造函数方式创建:new RegExp(字符串);
正则表达式匹配到的内容一定是字符串中的内容。
普通字符:字母,数字,下滑线,汉字,空格,逗号,分号,@,!等。
特殊字符:.*+等在正则中有特殊含义。
正则表达式 /让正则去匹配字符串
两种正则的方法,匹配字符串:
regexp.test(字符串);//如果能够找到返回true,反之false。
regexp.exec(字符串);//如果找到,则将字符串放入数组中,将数组返回。找不到返回null;
正则表达式默认情况下,区分大小写。
模式修饰符:(写在右斜杆右边,模式修饰符也需要小写,可随意搭配,无序)
i = ignoreCase 忽略大小写。
g = global 全局匹配。
m = multiline 多行匹配。
使用构造函数写法:new RegExp('字符串','修饰符');//注意修饰符也要用引号。
正则表达式 / 使用哪种方式创建正则表达式
一般情况下用字面量的形式写正则,用到构造函数的时候一般是要将变量字符串变为正则时使用。
正则表达式 / 简单的转义字符
\转义字符:将特殊字符转化成普通字符,将普通字符转化为特殊含义。
\n换行,利用ASCII码表,\x0A。
\t制表符tab。
利用unicode编码,\u0009。 中文字符范围:\u4e00到\u9fa5。
正则表达式 / 字符类
字符类[ ]:匹配里面的任意一个字符。
字符串中先出现[ ]内的哪个字符,匹配的就是哪个。然后这个[ ]就匹配结束了。只是匹配一个字符。
在[ ]内加个^表示,表示除了内部的字符以外的字符匹配。
如:/[ ^js ]/。 [ ]内部的范围从小到大排列或相等。
如:/[ a-z ]/或/[ x-x ]/或/ [ a-zA-Z ] /。
匹配汉字:/[ \u4e00-\u9fa5 ]/ 。
匹配数字:/[ 0-9 ]/。最大为9,最小为0。
正则表达式 /常用的字符类
特殊字符:
/./表示,匹配除了\n以外的所有字符,/[ ^\n ]/的简写。
特殊字符:
/\w/表示,/[a-zA-Z0-9_]/的简写。
/\W/表示,/[^a-zA-Z0-9_]/的简写。
【在正则中,大写字母一般情况表示小写字母的反面。】
特殊字符:/\d/表示,/[0-9]/的简写。(大写和上面同理)。
特殊字符:/\s/表示,空格和制表符等,空白字符都能匹配到。(大写同理)。
特殊字符也都可以写在[ ]中,这样就遵循了[ ]字符类的规则。
字符类和它相反的字符类加在一起就可以匹配所有字符。
正则表达式 / 重复
重复:
/{3}/表示重复三个。紧跟在需匹配的字符之后。
/{1,2}/表示1-2个都行。中间不能出现空格。
/{1,}/表示大于等于1个。可用/+/表示。
/{0,1}/表示 /?/。
/{0,}/表示/*/。
正则表达式 / 非贪婪的重复
贪婪匹配:默认情况下尽可能多的匹配。
var str = 'aaab'; var pattern = /a+/; console.log(pattern.exec(str));//['aaa']
非贪婪匹配:在量词{}+*?后面加上?(转化为非贪婪,在满足正则的情况下,末尾尽可能少的匹配)。
var str = 'aaab'; var pattern = /a+?/; console.log(pattern.exec(str));//['a']
正则表达式中总是会去寻找可能匹配的开头位置,就是首选,但不一定只匹配一个。
var str = 'aaab'; var pattern = /a+?b/; console.log(pattern.exec(str));//['aaab']
var str = 'aaab'; var pattern = /a+b/; console.log(pattern.exec(str));//['aaab']
正则表达式 / 选择
正则中的选择,分组,引用:
特殊符号:|。左右两边是完全分开的。从字符串最左边开始尝试匹配,字符串中先出现正则中的哪一项,就是哪一项,忽略其他项。若是正则中有好几项满足,则取正则中的最左边一项。
正则表达式 / 分组和引用
1,分组:量词仅能影响前一个字符,而不能影响一整串字符,想让字符串整体被影响,加上()分组即可。
2,exec()方法返回的数组,第一个值是整个正则表达式(括号内当成一个整体)匹配的字符串,第二个值是分组()捕获的字符串。依次类推。
3,在分组()内最前面加上?:即可设置不要捕获。
4,若是出现括号嵌套,只需从左开始数,看左括号,第一个左括号就是第一个分组,第二个左括号就是第二个分组,以此类推。
5,引用:在正则表达式中,若是出现分组,在表达式中即可用\1表示第一个分组,\2表示第二个分组,依次类推,若没有该分组,则无意义。
exec()方法中有两个属性,一个index是表示第一个匹配到的字符的位置,input属性是整个正则表达式匹配到的字符串。
正则表达式 / 位置匹配之首尾匹配
位置匹配:
首匹配: ^只能在开头匹配。若出现的字符不在开头,就算字符存在,也匹配不到。注意区分字符类[^]中的取反。
尾匹配: $只能匹配末尾,针对的不只是一个字符,而是一整个字符串。^也是同理。
首尾匹配是为了保证匹配的字符串从头到尾都符合条件,经常用在表单提交内容的验证中。
正则表达式 / 位置匹配之单词边界匹配
位置匹配之单词边界匹配: \b单词边界。
在构造函数参数中的转义字符都要进行双重转义。 如果正则里面为空可以匹配任何字符串。
正则表达式 / 位置匹配之单词前瞻性匹配和负向前瞻性匹配
特殊字符:
?=前瞻性匹配。 ?=左边才是要匹配的字符串,但必须满足?=右边的条件。
?!负向前瞻性匹配。 ?!左边是要匹配的字符串,?!右边要是满足,则不匹配。 ?=和?!以及右边的字符串需要用括号括起来。
正则表达式 / RegExp对象的实例方法(1)
构造函数匹配反斜杠,new RegExp('\\\\');
一般情况下正则表达式,只会找到一个满足,就结束,末尾加上g全局匹配后,字符串内满足的字符全部都会找到。
通过exec()方法。逐个返回,一个方法返回一个。匹配不到后,返回null。
正则表达式有个lastIndex属性:在没有设置全局匹配时,默认为0不变。设置了g全局匹配后,lastIndex会设置成:匹配到的最后一个字符的下一个索引位置。当找找完后,又会自动会到第0个位置。
正则表达式 / RegExp对象的实例方法(2)
toString()方法返回的是字面量形式的正则表达式的字符串。无论是构造函数方法实例化的正则对象还是字面量形式的正则对象。
toLocaleString();//转化成具有本地特色的字符串。基本上用不上。
valueOf();//返回的是正则表达式自己本身(不是字符串,是正则对象)。
正则表达式 / RegExp对象的实例属性和构造函数属性
注意区分对象实例和构造函数!
RegExp对象实例属性:
ignoreCase;//返回布尔值,判断有没有i忽略大小写的模式修饰符。
multiline;//返回布尔值,判断有没有m多行匹配的模式修饰符。
global;//返回布尔值,判断有没有g全局匹配的模式修饰符。
source;//返回字面量形式所对应的字符串。
lastIndex;//匹配字符串的最后一个索引的下一个索引。
构造函数属性:
RegExp.input;//匹配的字符串。等于(RegExp.$_)(RegExp['$_']。
RegExp.lastMatch;//最近一次匹配到的字符。等于(RegExp['$&'])。
RegExp.leftContext;//表示上一次匹配后,左边剩余的字符。等于(RegExp['$`'])。
RegExp.rightContext;//表示上一次匹配后,右边剩余的字符。等于(RegExp["$'"])。
RegExp.lastParen;//表示上一次匹配到的子选项,也就是分组捕获到的内容。等于(RegExp['$+'])。
上方的用到极少。
RegExp.$1~RegExp.$9;//和分组\1之类相同。
正则表达式 / String对象中与正则相关的方法之search,match和split
String对象中与正则表达式相关的方法:
search(正则表达式);//判断是否存在该正则,有一个则返回匹配到的位置的索引。找不到返回-1;有多个,依然返回第一个索引,与g全局匹配无关紧要。参数可以为字符串,但该字符串最终还是会转化为正则来判断。
match(正则表达式);//返回一个匹配的数组,和exec()方法类似;
不同的地方仅在于:全局匹配时,该方法会一次性返回所有匹配的字符串在一个数组中,并且不会返回分组匹配到的字符串。
有换行的地方才会用到m多行匹配。一般会和g连用。默认情况下是都有多行匹配的。一般与$或^ 存在的时候才会发挥作用。
split();//该字符串方法是将参数所表示的字符作为分割成多个数组元素的标志,该字符串方法传入正则表达式也可使用。
正则表达式 / String对象中与正则相关的方法之replace
字符串的replace()方法:返回的是新的字符串。
第一个参数,字符串里要被替换的字符。
第二个参数,替换的字符。 只能替换一个。
字符串的replace方法第一个参数可以传正则表达式,利用正则的全局匹配可以替换多个。
第二个参数可以传一个匿名函数,匿名函数的第一个参数表示的是整个正则匹配的字符串,第二个参数表示的是正则中的第一个分组,依次类推。可以用函数的返回值替换正则。
常用正则:
要求 1.全是数字 2.首位不能为0 3.最少5位数。验证必须要设置首尾匹配来限制,和普通的查找匹配不一样。
正则:/^[1-9]\d{4,}$/
昵称
要求 1.中,英文,数字以及下划线 2. 2-18位
正则:/^[\u4e00-\u9fa5\w]{2,18}$/
密码
要求 1.6-16位 2.不能用空白字符 ,区分大小写。
正则:/^\S{6,16}$/
正则表达式 / 去除字符串首尾的空白字符
var str = ' zhong '; var removeSpaceRegExp = /^\s+|\s+$/g; var removeSpaceRegExp2 = /^\s+/g; var removeSpaceRegExp3 = /\s+$/g; console.log(str.replace(removeSpaceRegExp, ''));//效率更低。 console.log(str.replace(removeSpaceRegExp2, '').replace(removeSpaceRegExp3, '')); //去除字符串首尾空格方法。 function trim(str) { return str.replace(/^\s+/,'').replace(/\s+$/, ''); }
正则表达式 / 匹配HTML标签
//匹配HTML标签: var str = '<p class=">" id="odd">hahah666</p>'; var pattern9 = /<(?:[^'">]|"[^"]*"|'[^']*')+>/g; var pattern10 = /<(?:[^'">]|(["'])[^"']*\1)+>/g; console.log(str.match(pattern9)); console.log(str.match(pattern10));
正则表达式 / email邮箱
var mail2 = 'alex_1.a-sdas.asdas.com@yah-o_o.com.ads.cn'; var mail = 'alex_1.asdas.asdas.com@yahoo.com.ads.cn' var mailPattern = /^(?:\w+\.)*\w+@(?:\w+\.)+[a-z]+$/i; var mail2Pattern = /^[a-z0-9]+(?:[-_\.]\w+)*@[a-z0-9]+(?:[-_\.][a-z0-9]+)*\.[a-z]{2,4}$/i; console.log(mailPattern.exec(mail)); console.log(mail2Pattern.exec(mail2));