补充
*1 转义字符 \
2 行结束符 \r
3 字符串换行符 \n(即回车等于\r\n)
4 缩进字表符 相当于tab键 \t
5 多行字符串
如
var test = “\
<\span>\
“;
//如此就实现了字符串多行 因为如果不写转义字符可能达不到换行的效果
正则表达式RegExp
作用 匹配特殊字符或有特殊搭配原则的字符的最佳选择
可以查询 w3cschool
正则表达式的属性
1 i 执行对大小写不敏感的匹配 即忽视大小写
2 g 执行全局匹配(查找所有匹配的项而非在找到第一个匹配后停止)
3 m 执行多行匹配
两种创建方式
1 直接量 var reg = / 匹配原则 /正则表达式属性;
例一
var reg = /abc/ ;
//此时就可以判断字符串是否符合正则表达式abc这样的原则
reg.test(“abcd”);
//返回true
例二
var reg = /abc/i;
reg.test(“ABCd”);
//返回true
2 new RegExp(字符串形式的规则,字符串形式的属性);
例一
var reg = new RegExp(“^a”,”gm”);
或
var reg = /^a/gm ;
var reg = new RegExp(reg);
//^a表示的意思是匹配以a开头的
var str = “abc\na”;
str.match(reg);
//返回两个a 因为这里m是多行匹配 如果没有m就只返回一个a
表达式
方括号用于查找某个范围内的字符 一个方括号[ ]代表一位 方括号里面的内容即为所要查找的范围
如 var reg = /[123][123][123]/g;
//全局范围查找的连着的三个数 且这三个数的每一位都要是1 2 3的其中一个数
//如 “12309asv78as121”; 返回的是 [“123”,”121”]
[^abc] 表示的是查找不在括号间的字符
[0-9] 表示查找任何0-9的数字
[A-z] 表示查找任何从大写A到小写z的字符(按ASC码表顺序排的)
(abc | bcd) 表示查找带有 abc 或 bcd 的字符
元字符
1 . 查找单个字符 但除了换行和行结束符外
如
var reg = /./g;
var str = “1 a”;
//返回 [“1”, “ “, “a”]
2 \w 查找单词字符 相当于[0-9 A-z _ ]
\W 查找非单词字符 即[^\w]
3 \d 查找数字 相当于[0-9]
\D 查找非数字 即[^\d]
4 \s 查找空白字符 空白字符包括空格符 制表符\t 回车符\r 换行符\n 垂直制表符\v 换页符\f 即[\t\r\n\v\f ]
\S 查找非空白字符 即[^\s]
5 \b 匹配单词边界 如 reg = /\bc/g; “abc cde efg” 单词边界如 abc的a和c、cde的c和e、efg的e和f
匹配以c边界开头的 即返回cde
\B 匹配非单词边界 即[^\b]
6 \t 匹配制表符 注意是要真的写在字符里面的\t才行 而不只是视觉上的 如 “abc\tcde”
……
量词(遵循的是贪婪匹配 能匹配多就尽量匹配多)
(若不想遵循贪婪匹配 可以在表达式后面加? 能尽量匹配少就尽量匹配少)
1 n+ 匹配任何包含至少一个 n 的字符串 即 n 可以出现1到无限次
如 var reg = / \w+/g;
var str = “abc”;
//即符合\w的字符出现多少次都可以
//输出”abc”
2 n 匹配任何包含零个或多个 n 的字符串
如 var reg = /\w/g;
var str = “abc”;
//其匹配的依据是根据光标的位置 如果能匹配的话就先把值匹配了
//若根据规则匹配不出来 那么在光标处返回一个空串
//输出 [“abc”, “”]
var reg = /\d/g;
var str = “abc”;
//这里根据\d规则无法匹配字符串里的字符 那么全局匹配光标共有四处
//a前a后 b后 c后
//所以输出四个空串 [“”, “”, “”, “”];
var reg = /a?/g;
var str = “aaa”;
//这里不遵循贪婪匹配 能不匹配尽量不匹配
//所以返回四个空串 [“”, “”, “”, “”];
3 n? 匹配任何包含零个或一个 n 的字符串 规则同上差不多
4 n{X} 匹配包含 X 个 n 的序列的字符串
n{X,Y} 匹配包含 X 至 Y 个 n 的序列的字符串
n{X, } 匹配包含至少 X 个 n 的序列的字符串
如 var reg = /\w{2}/g;
var str = “abc”;
//返回 “ab”
var reg = /\w{2,4}/g;
var str = “abcab”;
//返回 “abca” 最后一个b因为不满足两个字符所以无法匹配
5 n$ 匹配任何结尾为 n 的字符串
^n 匹配任何开头为 n 的字符串
如 var reg = /^abc$/g;
var str = “abcabc”;
//即以abc开头 以abc结尾 且abc要是同一个abc
//所以返回null
6 ?=n 匹配任何其后紧接指定字符串 n 的字符串(正向预查/正向断言)
?!n 匹配任何其后没有紧接指定字符串 n 的字符串
如 var reg = /a(?=b)/g;
var str = “abcabc”;
//匹配的是字符a后面跟着字符b的字符a
//符合的有两个 所以输出两个a [“a”,”a”]
var reg = /a(?!b)/g;
var str = “abcabc”;
//匹配的是字符a后面不跟着字符b的字符a
//没有符合的 所以输出null
正则表达式对象的方法
1 test 检索字符串中指定的值 返回 true 或 false
*2 exec 检索字符串中指定的值 返回找到的值 并确定其位置 此时lastIndex指向匹配字符串所在位置的下个位置
若为全局匹配 则下次匹配时 从lastIndex位置开始匹配 我们也可以认为的修改lastIndex的值
若为匹配的重复字符(见下面拓展) 那么还会返回子表达式的匹配内容
如
<script>
//例一
var reg = /ab/g;
var str = "abcabcab";
console.log(reg.exec(str)); //["ab", index: 0]
console.log(reg.lastIndex); //2
console.log(reg.exec(str)); //["ab", index: 3]
console.log(reg.lastIndex); //5
console.log(reg.exec(str)); //["ab", index: 6]
console.log(reg.lastIndex); //8
console.log(reg.exec(str)); //null
console.log(reg.lastIndex); //0
//匹配完后从头开始
console.log(reg.exec(str)); //["ab", index: 0]
console.log(reg.lastIndex); //2
//例二
var reg = /(\w)\1(\w)\2/g;
var str = "aabb";
console.log(reg.exec(str)); // ["aabb", "a", "b", index: 0]
</script>
拓展
怎么实现匹配重复的字符
(n)\1 表示括号中匹配 n 的内容 然后反向引用给\1 这里数字可以随便写 但是会根据你需要重复的字符来设置
如 var reg = /(\w)\1\1/g;
var str = “aaabbb”;
//先匹配\w为字符a 再将a引用给后面的两个\1\1
//所以结果为 [‘aaa’,’bbb’]
var reg = /(\w)\1(\w)\2/g;
var str = “aabb”;
//先匹配\w为字符a 再将a引用给后面的\1
//再匹配\w为字符b 再将b引用给后面的\2
//所以结果为 [‘aabb’]
例 string的replace方法
1 replace(str1,str2)
可以用str2替换字符串中的str1字符 不过默认只替换符合要求的第一个
如 “ab”.replace(“a”,”b”); 结果为 “ba”
2 replace(reg,str)
若是配合正则表达式的全局匹配来使用就可以全部替换
如
var reg = /(\w)\1(\w)\2/g;
var str = “aabb”;
str.replace(reg,”$2$2$1$1”); //可以用$来引用正则表达式中的匹配内容
//结果即为bbaa
3 replace(reg,function($,$1,$2) { } )
这里$代表全局匹配到的内容 没什么用
$1表示第一个子表达式的匹配到的内容
$2表示第二个子表达式的匹配到的内容
如
var reg = /(\w)\1(\w)\2/g;
var str = “aabb”;
str.replace(reg,function($,$1,$2){
return $2+$2+$1+$1;
});
//结果即为bbaa
例 将 the-first-name 变为 theFirstName
var reg = /-(\w)/g;
var str = “the-first-name”;
console.log(str.replace(reg,function($,$1){
return $1.toUpperCase();
}));**