知识准备
1.转义字符
"\"会将其后面的东西转义成为文本。
2多行字符串
var str = "aga\r\ndfads";
console.log(str);
3.字符串换行符\n
document.body.innerHTML="
<div></div>
<span></scpan>
"; // 格式简单清晰,但是包含换行,所以将每一行后面加一个转移字符"\",可以将文本回车转义掉,不再是回车
另外一个解决方式
document.body.innerHTML=
"<div></div>"+
"<span></span>"+.....
--------------------------------------------------------------------------------------------------
正则表达式
RegExp 是正则表达式的缩写。
检索某个文本时,可以使用RegExp模式来描述要检索的内容。
简单的模式可以是一个单独的字符。
更复杂的模式包括了更多的字符,并可用于解析、格式检查、替换等等。
可以规定字符串中的检索位置,以及要检索的字符类型,等等。
正则表达式的应用:匹配特殊字符或有特殊搭配原则的字符的最佳选择
两种创建方式:
直接量 // 推荐使用
new RegExp();
和Date()类似,可以new对象
RegExp对象的方法
1.test() //检索字符串中的指定值,返回值是true或false
例:
var str = "abdsd";
var reg =new RegExp("b"); // 创建对象
var reg = /abc/; // 规定的字符片段
console.log(reg.test(str)); //返回值是false
2.exec() // 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。
3.compile() // 既可以改变检索模式,也可以添加或删除第二个参数。
正则表达式后面可以跟属性,分别是“g”,“i”,“m“,代表的意思分别是
"g":全局匹配 (查找所有匹配而非在找到第一个匹配后停止)
"i":区分大小写(ingoreCase:执行对大小写不敏感的匹配)
"m":多行匹配(ECMAScript标准化之前,不支持m属性,多行匹配的必须是字符串才可以)
var reg = /abc/igm; // g i m可以随意组合放在其后
var reg =new RegExp("b",”mgi“);第一个可以是字符串,也可以是已知的正则表达式,比如上面定义的reg变量,第二个参数可以写属性,三者中任何一个或者其组合
例:
var reg = /abc/;
var reg1 = new RegExp(reg); // reg1和reg是内容一样,但是不同的对象
var reg2 = RegExp(reg); // 相同的内容,相同引用对象
g:
例
var reg = /ab/g;
var str = "abababababab";
str.match(reg);
---> ["ab","ab","ab","ab","ab","ab"
i:
例:
var reg = /abc/i;
var str = "EabC";
str.match(reg);
--->["abc"]
m:
例:
var reg = /^abc/gm; // 以a开头多行全局匹配
var str = "abcabc\nabcabcabcabc";
console.log(str.match(reg));
--->["abc","abc"]
正则表达式的高级语法应用:
http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp
1.[abc] 查找方括号之间的任何字符。// []一个方括号代表一位,里面填的东西代表一个区间
var reg = /[][][]/; // 相当于 reg=/123/;
var reg = /[0-9A-z]/;
2.^
1).放在[]外,表示以其后面的字母开头
2).放在[]内,表示非,除了的意思
3.(A|B)
或的意思
元字符(拥有特殊含义的字符)
. 查找单个字符,除了换行和行结束符
\w ===[0-9A-z_]
\W===[^\w]
\d ===[0-9]
\D===[^\d]
\s ===[\t\n\r\v\f ] // 空白字符(空格符 ,制表符\t,回车符\r,换行符\n,垂直换行符\v,换页符\f)
\S ===[^\s]
\b===单词边界
\b===非单词边界
检验一个字符串首尾是否含有数字
var reg = /^\d[\s\S]*\d$/;
重要的方法
// reg.exec();
例:
var reg = /ab/g; // g全局匹配,不加的话,游标一直是0
var str = "ababab";
console.log(reg.lastIndex); // exec的游标,也就是匹配位置
console.log(reg.exec(str)); // exec方法的属性是lastIndex
console.log(reg.lastIndex); // 游标的变化就是lastIndex的变化,结束的位置就是下一个匹配的开始位置
console.log(reg.exec(str));
console.log(reg.lastIndex);
console.log(reg.exec(str));// 控制台有时候会显示不完全信息,用console.log()来打一你
console.log(reg.lastIndex);
console.log(reg.exec(str));// 0,2,4,6,NULL,0...循环匹配
输出的结果:
打开第一个输出结果,看数据结构属于类数组:
注意:lastIndex的值,可以手动改写
var reg = /ab/g; // g全局匹配,不加的话,游标一直是0
var str = "ababab";
console.log(reg.lastIndex); // exec的游标,也就是匹配位置
console.log(reg.exec(str)); // exec方法的属性是lastIndex
reg.lastIndex=0;
console.log(reg.exec(str)); // 可以手动修改游标的位置
console.log(reg.lastIndex); // 值输出的是游标为0的匹配结果
()的应用
1.指定或的关系 // 有疑问???
2.子表达式
例:
var str = "aaaaa”;
var reg= "/(a)\1/g"; // 子表达式\1反向引用第一个子表达式匹配的内容
var str = "aabb";
var reg = /(\w)\1(\w)\2/; // \1反向引用第一个子表达式匹配的内容,\2反向引用第二个子表达式匹配的内容
支持正则表达式的string对象方法
- match();
str.match(reg); // 字符串匹配正则表达式
console.log(str.match(reg)); // 将所有满足条件的匹配结果打印出来
-->
var str = "aabb";
var reg = /(\w)\1(\w)\2/g;// 属于完全匹配,
console.log(str.match(reg));
-->
展开该结果:
- search()方法 // 匹配的位置,跟lastIndex没有关系,返回值如果没有匹配,返回值为-1
- split()方法 // 可以用字符串,也可以用正则表达式,返回值包含满足子表达式的值
- replace()方法 // str.replace("a","b"); a替换b
例:
1)var str = "aa";
console.log(str.replace("a","b")); // "ba" 原因是replace没有访问全局的能力 跟正则表达式不一样
2)var str = "aa";
var reg =/a/;
console.log(str.replace(reg,"b")); // "ba"
3)var str = "aa";
var reg =/a/g;
console.log(str.replace(reg,"b")); // "bb" 全局匹配
4)aabb用正则表达式替换成bbaa
var str = "aabb";
var reg = /(\w)\1(\w)\2/g;
console.log(str.replace(reg,"$2$2$1$1")); // "bbaa" 第二个参数一定是字符串
5)基于4)的写法
console.log(str.replace(reg,function($,$1,$2){ // $表示正则表达式匹配的全局内容,$1表示第一个子表达式的内容,$2表示第二个子表达式的内容
return $2+$2+$1+$1;
}));
6)基于5)的可以有toUpperCase(),toLowerCase()
7).驼峰式写法正则表达式
// the-first-name 变成 小驼峰字符串 theFirstName
var str = "the-first-name";
var reg = /-(\w)/g;
console.log(str.replace(reg,function($,$1) {//$(第一个参数)表示正则表达式匹配的全局内容,$1(第二个参数)表示第一个表达式的内容(\w)function执行次数是匹配的次数
return $1.toUpperCase();
}));
// 正向预查,正向断言
?=n
var str = "aaaaa";
var str = /a(?=b)/g; // a后面跟着b的匹配 str = /a(?!b)/g;
注意:特殊的字符
\ , *,?等,在正则表达式中要匹配的话,需要在前面加\,将其转义$得用$进行转义 -->$$
去重的应用
var str = "aaaaaaabbbccccc";
var reg = /(\w)\1*/g;
console.log(str.replace(reg,"$1")); // “abc”
将长的数字写成美元的格式三位数加.
var str = "100000000000000";
var reg = /(?=(\B)(\d{3})+$)/g;
console.log(str.replace(reg,"."));