js——正则
转移符: \
显示特殊字符,想显示\用‘\\’
\后面加特殊字母为特定用途。例: \n 换行(回车); \r 行结束(正常一个回车代表\r+\n); \t-->tab键--> table 缩进
转移符实用场景1:
document.body.innerHTML = "<div>\
<span>content</span>\
<p>内容</p>\
</div>"
两种创建方式:
- 直接量(例:var reg = /规则/正则属性[i/g/m];)推荐
- new RegExp(“规则”, 正则属性);
属性/修饰符(可以一个或多个混合使用):
- i 忽略大小写(ignoreCase)
- g 全局(global)
- m 多行匹配(在有换行符\n中匹配多行)
reg.test(); //判断字符串有没有符合要求的片段,返回true或false
str.match(reg); // 把所有符合要求的内容返回,match是字符串的方法
reg.exec(); 以reg.lastIndex的游标位置开始匹配,exec是正则表达式的方法
reg.lastIndex 与 reg.exec()相匹配,如果不加g(即不全局匹配),则lastIndex一直是0
[] // 表达式,代表一位,其中写的是取值区间
^ 如果放在表达式中表示非(!),否则表示以什么开头; ...$表示以...结尾
(值a | 值b) // 取值a或者值b
\w (world) === [0-9A-z_]
\W === [^\w]
\d === [0-9]
\D === [^\d]
\s (空白字符) === [\t\n\r\v\f ]
\S === [^\s]
\b === 单词边界 例: /\bcde\b/g;
\B === 非单词边界
. === [^\r\n]
n+ {1, 正无穷}
n* {0, 正无穷}
n? {0, 1}
正在则表达式默认为贪婪匹配,能一次多个匹配,不会多次少个匹配。
在表达式后加?则为非贪婪匹配
var reg = /^\d[\w\W]*\d$/g; // 匹配首尾都是数字
() // 子表达式
/(\w)\1/; // “\1”:反向引用第一个子表达式中的内容 ,即 匹配 xx
reg.exec(str); // 子表达式的值也会被加到类数组中
// 匹配aabb var reg = /(\w)\1(\w)\2/g;
str.replace
var str = "aa"; str.replace('a', 'b'); console.log(str); // "ba"(不全局匹配) var reg = /a/; str.replace(reg, 'b'); // ba var reg1 = /a/g; str.replace(reg1, 'b'); //bb
例题:把aabb变成bbaa
var reg = /(\w)\1(\w)\2/g; var str = "aabb"; str.replace(reg, "$2$2$1$1"); // $2代表第2个子表达式的内容(反向引用) console.log(str); // bbaa 或 str.replace(reg, function($, $1, $2){ return $2+$2+$1+$1; }) // 回调函数中的$表示正则表达式匹配的结果
匹配汉字: [\u4e00-\u9fa5]
匹配双字节及汉字: [^\x00-\xff]
正向预查(正向断言)
在表达式后加 “?” 为非贪婪匹配
(?=值) 为正向预查
var str = "abaaa"; var reg = /a(?=b)/g; // 找后面跟b的a str.match(reg); // a
例题: 科学计数法(1000000..... ==> 100.000.000)
var str = "100000000"; var reg = /(?=(\B)(\d{3})+$)/g; str.replace(reg, "."); 解析: ?= // 正向预查 \B // 非单词边界 \d // 数字 {3} // 3个 + //1个或多个 $ //以...结尾(表示从后往前查) g // 全局
例题: 去重
var str = "aaaaaabbbbbdddd"; var reg = /(\w)\1+/g; str.replace(reg, '$1'); // abd