正则表达式复习
RegExp
正则表达式的作用:匹配特殊字符或有特殊搭配原则的字符的最佳选择。
参考w3shcool-JavaScript RegExp对象
两种创建方式
- 1 直接量 (推荐)
var reg = /abc/i;/* ignoreCase表示忽略大小写 */
var str = "abdec";
console.log(reg.test(str));//false
- 2 new RegExp();
//var reg = new RegExp("abc");
//也可以带参数
var reg = new RegExp("abc", "m");
修饰符i\m\g
| 修饰符 | 描述 |
|---|---|
| i | 执行对大小写不敏感的匹配。 |
| g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
| m | 执行多行匹配。 |
// var reg = /^a/g; //表示匹配以a开头的字母
var str = "abcde\na";//中间插入一个换行符,目前没有多行匹配功能,故只能匹配到一个a
var reg = /^a/gm;
var str = "abcde\na";//可以匹配到两个a
str.match(reg);//["a","a"]
// reg.test();----> 返回的是true/false
// str.match();---->返回所有匹配上的片段
// 一个[]代表一位,其中输入范围
var reg = /[1234567890]/g;
// 范例:
var reg = /[ab][cd][d]/g;
var str = "abcd";
reg.test(str);//["bcd"]
// ^放在表达式[]中表示非
var reg = /[^a][^b]/g;
// | 表示或
var reg = /(abc|bcd)/g;
var str = "bcd";
// \w === [0-9A-z_]
var reg = /\w/g;
var str = "bcd2_";
str.match(reg);//["b", "c", "d", "2", "_"]
// \W === [^\w]
var reg = /\Wcd2/g;
var str = "b*cd2";
// \d === [0-9]
var reg = /\d\d\d/g;
var str = "123";
// \D === [^\d]
// \s 用于查找空白字符
// \s === [\t\n\r\v\f ] \s 等于这5个加空格
/*
空白符
制表符
回车符
换行符
垂直换行符
换页符
*/
// \b === 单词边界
// \B === 非单词边界
var reg = /\bc/g;//表示以c为单词边界
//键盘的tab系统不认,应用\t
//u0000 四位的unicode编码。 16进制
//unicode编码时分层的
//\u010000 - \u01ffff. 第一层
//\u020000 - \u02ffff。 第二层
//\u100000 - \u10ffff。 第三层
//[unicode编码在线转换]
var reg = /[\u0000-\uffff]/g;
var str = "老邓身体好";
//注意: 如何匹配所有
var reg = /[\s\S]/g;
// . === [^\r\n]
var reg = /./g;
var str = "老 邓身体好";
// 这些都是贪婪匹配原则,能多就不会少
// n+ === {1,}
// n* === {0,}
// n? === {0,1}
// n{X} === {x}
// n{x,y} === {x,y}
// n{x,} === {x,正无穷}
// 注意:下面的例子容易错
var reg = /\d*/g;
var str = "abc"; //["","","",""]
var reg = /\w?/g;
var str = "aaaaaa"; //["a","a","a","a","a","a",""]
var reg = /\w{3}/g;
var str = "aaaaaaa"; //3个3个匹配 ["aaa","aaa"]
var reg = /\w{3,5}/g;
var str = "aaaaaaa"; //贪婪匹配原则,能多就不能少 ["aaaaa"]
var reg = /\w{1,}/g;
var str = "aaaaaaa"; //["aaaaaaa"]
//^ -->以……开头
//$ -->以……结尾
//检查一个字符串首尾是否有数字
var reg = /^\d|\d$/g;
var str = "abc";
//检查首尾都含有数字
var reg = /^\d[\s\S]*\d$/g;
var str = "123abc";
//查看在reg中是否写了i,g,m
reg.ignoreCase //false
reg.global //true
reg.multiline //false
reg.source //"^\d[\s\S]*\d$"
reg.exec(str) //检索字符串中指定的值,返回找到的值,并确定其位置
//["ab",index: 0,input: "aba",groups:undefined]
var reg = /ab/g; //正则表达式不加\g,reg.lastIndex压根就不动
var str = "abababab";
//reg.lastIndex 游标属性
console.log(reg.lastIndex);//0 游标的位置
console.log(reg.exec(str));//["ab", index: 0, input: "abababab", groups:undefined]
console.log(reg.lastIndex);//2
console.log(reg.exec(str));//["ab", index: 0, input: "abababab", groups: undefined]
console.log(reg.lastIndex);//4
console.log(reg.exec(str));//["ab", index: 4, input: "abababab", groups: undefined]
console.log(reg.lastIndex);//6
console.log(reg.exec(str));//["ab", index: 6, input: "abababab", groups: undefined]
console.log(reg.lastIndex);//8
console.log(reg.exec(str));//null
console.log(reg.lastIndex);//0
console.log(reg.exec(str));//["ab", index: 0, input: "abababab", groups: undefined]
// 题目: 匹配"xxxx"的所有的字符串
var reg = /(a)\1/g; //其中(a)是子表达式,"\1"反向引用了表达式
var str = "aaaa";
var reg = /(\w)\1/g; //\w匹配出来的内容,我后面要copy一个一模一样的出来
var reg = /(\w)\1\1\1/g;
var str = "aabb";
var reg = /(\w)\1(\w)\2/g; "\2"是反向匹配第二个表达式的内容
console.log(str.match(reg)); //reg不加/g -->["aabb","a","b",index:0,input: "aabb"] reg加上/g ---> ["aabb"]
//支持正则表达式的String对象的方法
search\match\replace\split -->详细信息见http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp
console.log(str.search(reg)); //匹配不到时返回-1,上面的匹配到的情况,返回0,加不加/g没有区别
var str = "aabb";
var str1 = "qwertaauiop[bbjkl"
var reg = /(\w)\1/g;
console.log(str.split(reg)); //按单词重复的地方拆字符串 ["","a","","b",""]
console.log(str1.split(reg)); //["qwert","a","uiop[","b","jkl"]
var str = "qwe1ty2ui";
var reg = /\d/g; \\按照数字来拆分 ["qwe","1","ty","2","us"]
//replace 替换与正则表达式的匹配
var str = "aa";
console.log(str.replace("a","b")); //不用正则表达式没有匹配全局的能力 "ba"
var reg = /a/g;
var str = "aa";
console.log(str.replace(reg,"b")); //不加g -->ba 加g-->bb 注意注意!!
//思考: 如何将aabb-->倒过来变成bbaa
var reg = /(\w)\1(\2)\2/g;
var str = "aabb";
console.log(str.replace(reg,"$2$2$1$1")); //这第二个参数必须是字符串 $1是第一个子表达式的内容,$2表示第二个子表达式的内容
//也可以写函数返回字符串
console.log(str.replace(reg,function($,$1,$2){
return $2 + $2 + $1 + $1;
})); //$全局匹配的字符串,$1第一个子表达式,$2第2个子表达式
//变大写变小写
str.toUpperCase().toLowerCase();
//将the-first-name---> theFirstName
var reg = /-(\w)/g;
var str = "the-first-name";
console.log(reg,function($,$1){
return $1.toUpperCase();
});
//思考: 要选择一个a使它后面必须跟着b,后面跟着b的a符合要求
//?=n 匹配任何气候紧跟指定字符串n的字符串
var str ="abaaaa";
var reg = /a(?=b)/g; //a后面跟着b,但b不参与选择只参与修饰
var reg = /a(?!b)/g; //后面不跟着b的那个a
//?=n 正向预查
//?!n 非正向预查
var str = "aaaa";
var reg = /a+?/g; //非贪婪匹配
//在量词的后面加?(转入非贪婪匹配)有1绝对不取2
var reg = /a{1,3}?/g;
var reg = /a??/g; 第一个?量词,第二个?非贪婪匹配,能取零绝不取一;
//思考:字符串去重
var str = "aaaaaaabbbbbcccccccccc";
var reg = /(\w)\1*/g;
console.log(str.replace(reg,"$1"));
//思考 如何var = str="100000000"-->100.000.000
//1、一定要从后往前查询,要用到$
//2、匹配这样一个空,空后面跟着3的倍数位数字
var str = "100000000";
var reg = /(?=(\d{3})+$)/g; var reg = /(?=(\B)(\d{3})+$)/g;
console.log(str.replace(reg,".")); //将空替换成·
//必须得是非单词边界,故加上(\B)
匹配中文的正则表达式:
[\u4e00-\u9fa5]+

浙公网安备 33010602011771号