2. 字符类
- 一般情况下正则表达式一个字符对应字符串一个字符
- 我们可以使用[]来构建一个简单的类
- 所谓类是指符合某些特性的对象,一个泛指,而不是特指某个字符
- 表达式[abc]把字符a或b或c归为一类,表达式可以匹配这类字符
'a1b1c1d1'.replace(/[abc]/g, 'x') \\"x1x1x1d1"
'a1b1c1d1'.replace(/abc/g, 'x') \\"a1b1c1d1"
- 使用^创建反向类/负向类 ,反向类的意思是不属于某类的内容,表达式[^abc]不是a或者b或者c的内容
'a1b1c1d1'.replace(/[^abc]/g, 'x') \\"axbxcxxx"
3. 范围类
- 可以使用[a-z]来连接两个字符表示从a到z的任意字符
- 这个闭区间就是包含a和z本身
'a1b1c1d1'.replace(/[a-z]/g, 'Q') \\"Q1Q1Q1Q1"
- 在[]组成的类内部是可以连写的[a-zA-Z]
'2019-01-01'.replace(/[0-9-]/g, 'Q') \\"QQQQQQQQQQ"
4. 预定义类
- 正则表达式提供预定义类来匹配常见的字符类
//匹配一个ab+数字+任意字符 的字符串
ab[0-9][^\r\n] == ab\d.
'This is a boy'.replace(/is/g,'0') \\"Th0 0 a boy"
'This is a boy'.replace(/\bis/g,'0') \\"This 0 a boy"
'This is a boy'.replace(/\Bis/g,'0') \\"Th0 is a boy"
'@1@2@abc@h'.replace(/@./g,'Q') \\"QQQbcQ"
'@1@2@abc@h'.replace(/^@./g,'Q') \\"Q@2@abc@h"
'@1@2@abc@h'.replace(/@.$/g,'Q') \\"@1@2@abcQ"
5 量词
6 贪婪模式和非贪婪模式
- 贪婪模式是尽量匹配多的字符串
- 非贪婪模式是让正则表达式尽量少的匹配,一旦成功就不再尝试,做法就是在量词后面加上?
'12345678'.replace(/\d{3,6}/g,'X') \\"X78"
'12345678'.replace(/\d{3,6}?/g,'X') \\"XX78"
7 分组
- 使用()可以达到分组的功能,使量词作用于分组
'a1b2c3d4'.replace(/([a-z]\d){3}/g,'X') \\"Xd4"
- 或 使用 | 可以达到或的效果
'abbcaddc'.replace(/a(bb|dd)c/g,'X') \\"XX"
- 反向引用 使用 $符号
'2019-08-03'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$3/$2/$1')
\\"03/08/2019"
- 忽略分组 不希望捕获某些分组,只需要在分组内加上?: 就可以了
'2019-08-03'.replace(/(?:\d{4})-(\d{2})-(\d{2})/g,'$3/$2/$1')
\\"$3/03/08"
8 前瞻
- 正则表达式从文本头部向尾部开始解析,文本尾部方向,称为前
- 前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言
'a2*3'.replace(/\w(?=\d)/g, 'X')
"X2*3"
'a2-33dd3'.replace(/\w(?!\d)/g, 'X')
"aX-3XXdX"
9 text()和exec()方法
- test() 方法用于检测一个字符串是否匹配某个模式.,如果字符串中有匹配的值返回 true ,否则返回 false。
\\不全局匹配的话一直返回true
var ret1 = /\d(\w)\d/g;
var res = "1a23b4";
ret1.test(res) \\true
ret1.test(res) \\true
ret1.test(res) \\false
- exec() 方法用于检索字符串中的正则表达式的匹配。如果字符串中有匹配的值返回该匹配值,否则返回 null。
var ret1 = /\d(\w)\d/g;
var res = "1a23b45c6";
while (ts = ret1.exec(res)) {
console.info(ts);
}
\\["1a2", "a", index: 0, input: "1a23b45c6", groups: undefined]
\\["3b4", "b", index: 3, input: "1a23b45c6", groups: undefined]
\\["5c6", "c", index: 6, input: "1a23b45c6", groups: undefined]
10 字符串对象方法
- search() 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。如果没有找到任何匹配的子串,则返回 -1。不执行全局匹配,自动忽略标志g
var str="Visit Runoob!";
var n=str.search("Runoob"); \\6
- match()方法 具有g标志将执行全局检索,找到字符串中的所有匹配子字符串,没有找到匹配的字符串将返回null,如果找到一个或多个匹配字符串,将返回数组
var ret1 = /\d(\w)\d/g;
var res = "1a23b4";
console.info(res.match(ret1)); \\ ["1a2", "3b4"]
\\不带g标志 ["1a2", "a", index: 0, input: "1a23b4", groups: undefined]
- split() 方法用于把一个字符串分割成字符串数组。提示: 如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。注意: split() 方法不改变原始字符串
var ret1 = /\d/g;
var res = "1a23b4";
res.split(ret1) \\ ["", "a", "", "b", ""]
- replace()方法用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。该方法不会改变原始字符串。
var ret1 = /\d/g;
var res = "a1b2c3d4";
//回调函数 参数 1匹配字符串 2分组,没有则没有这个参数 3匹配字符串index位置 4原字符串
console.info(
res.replace(/(\d)/g, function(match, ground1, index, origin) {
console.info(index + "+" + origin + "+" + ground1);
return parseInt(match) + 1;
})
);
\\位置:1原字符串:a1b2c3d4分组1
\\位置:3原字符串:a1b2c3d4分组2
\\位置:5原字符串:a1b2c3d4分组3
\\位置:7原字符串:a1b2c3d4分组4
\\a2b3c4d5