正则表达式学习
修饰符:
- g:global全文搜索,不添加,搜索到第一个匹配停止。
- i:ignore case 忽略大小写,默认大小写敏感。
- m:multiple lines 多行搜索。
- lastIndex:当前表达式匹配内容的最后一个字符的下一个位置
- source:正则表达式的文本字符串
正则表达式有2种基本字符类型组成:
- 原义文本字符(比如:abc)
- 元字符(比如:\b)。元字符是正则表达式中有特殊含义的非字母字符 (.*+?^.|\(){}[])
元字符:
- \t:水平制表符
- \v:垂直制表符
- \n:换行符
- \r:回车符
- \0:空字符
- \f:换页符
字符类:
- [abc]:构建一个简单的类(比如:'a1b2c3d4'.replace(/[abc]/g,'X') =》X1X2X3d4)
- [^abc]:取反
范围类:
- [a-z]:从a到z的任意字符,包含a和z。(比如:'a1b2c3d4aa'.replace(/[a-z]/g,'X') =》X1X2X3X4XX)
- [a-zA-Z]:在[]组成的类内部可以连写的。
- [a,z]:分割('12345678'.replace(/[1,3]/g,'A') =》A2A45678)
预定义类:
- .:除了回车符和换行符之外的所有字符([^\r\n])
- \d:数字字符([0-9])
- \D:非数字字符([^0-9])
- \s:空白符([\t\n\x0B\f\r])
- \S:非空白符([^\t\n\x0B\f\r] )
- \w:单词字符,包含字符、数字、下划线([a-zA-Z_0-9])
- \W:非单词字符([^a-zA-Z_0-9 ])
边界匹配字符:
- ^:以xxx开始('@123@abc@a'.replace(/^@./g,'X') =》X23@abc@a)
- $:以xxx结束('@123@abc@a'.replace(/@.$/g,'X') =》@123@abcX)
- \b:单词边界
- \B:非单词边界
量词:
- ?:出现0次或1次
- +:出现1次或多次
- *:出现0次或多次
- {n}:出现n次
- {n,m}:出现n到m次
- {n,}:至少出现n次
贪婪模式:正则表达式会尽可能多的匹配,直到匹配失败。('12345678'.replace(/\d{3,6}/g,'A') =》A78)
非贪婪模式:尽可能少的匹配。在量词后面加上?即可。('12345678'.replace(/\d{3,6}?/g,'A') =》AA78)
分组:
- 使用()可以达到分组的功能,使量词作用于分组('a1b2c3d4'.replace(/(\w\d){3}/g,'X') =》Xd4)
- 或|('a1b2c3d4'.replace(/(a1|b2)/g,'X') =》XXc3d4)
反向引用('2017-05-06'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$1') =》05/06/2017)
忽略分组:不希望捕获某些分组,只需要在分组内加上?:就可以
前瞻:在正则表达式匹配到规则的时候,向前检查是否符合断言,后顾方向相反,JS不支持后顾。
- 正向前瞻:exp(?=assert)('a2*3'.replace(/\w(?=\d)/g,'X') =》X2*3)
- 负向前瞻:exp(?!assert)
- 正向后顾:exp(?<=assert),JS不支持。
- 负向后顾:erp((?<!assert),JS不支持。
test(str):用于测试字符串参数中,是否存在匹配正则表达式模式的字符串。(var reg1 = /\w/; reg1.test('a');//true)
exec(str):使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果。
如果没有匹配的文本则返回null,否则返回一个结果数组:index 声明匹配文本的第一个字符的位置,input 存放呗检索的字符串string