一、原子(可以分微可见原子和不可见原子)
1、可见原子
- 标点;”、/ ?.等等
- 英文字母数字a-z, A-Z, 0-9
- 汉字、韩文、日文、阿拉伯文等
- ∑ π ∩ ∈ △ 等数理化符号
- 其他可见字符
2、不可见原子
换行符 \n 回车 \r 制表符 \t 空格、其他不可见符号
二、元字符
1、原子的筛选方式
| | 匹配两个或多个分支选择 |
[ ] | 匹配方括号汇总任意一个原子 |
[^ ] | 匹配除方括号中原子以外的任意字符 |
/ab|cd/.test('abcde')
// true
/[123]/.test('abc45')
//匹配123中任意一个
//false
/[^123]/.test('abc45')
//匹配非123以外的字符
//true
/[12^3]/.test('abc^45')
//true
/[a-gA-Z3-6]/.test('12yxz')
//false
需要注意的是
如果^不在首位的话就当普通字符匹配了
2、原子集合和量词
. | 匹配除换行之外的任意字符,即 [^\n] |
\d | 匹配任意一个十进制数字,即 [0-9] |
\D | 匹配任意一个非十进制数字,即 [^0-9] |
\s | 匹配一个不可见的原子, 即 [\f \n \r \t \v] |
\S | 匹配一个可见的原子, 即 [^\f \n \r \t \v] |
\w | 匹配任意一个数字、字母、下划线,即 [0-9a-zA-Z_] |
\W | 匹配任意非一个数字、字母、下划线,即 [^0-9a-zA-Z_] |
x{n} | 表示x刚好出现n次 |
x{n, } | 表示x至少出现n次 |
x{n, m} | 表示x在n和m次之间,包含 |
x* | 匹配大于等于0次, 即x{0, }。 x*? 即x{0} |
x+ | 匹配大于等于1次, 即x{1, }。 x+? 即x{1} |
x? | 匹配等于0次或1次, 即x{0, 1} |
\b | 匹配字的边界,即字和空格之间位置 |
\B | 匹配非字的边界 |
\f | 匹配换页字符 |
\n | 匹配换行字符 |
\r | 匹配回车字符 |
\t | 匹配制表字符 |
\v | 匹配垂直制表符 |
x*? | 匹配0个x |
x+? | 匹配1个x |
3、分组
(x) | 分组,并且记录匹配到的字符串 | 'abcd'.match(/(abc)/) |
\n | 使用分组(x)匹配到的字符串 | /(a)\1(b)\2/.test('aabb') |
(?:x) | 仅分组,不记录, | 'abc'.match(/(?:ab)/) |
(?=x) | 分组匹配x之前的字符串并记录 | `com">`.match(/^.{1,10}(?=(">))/) |
(?<=x) | 分组匹配x之后的字符串并记录 | `="www.`.match(/(?<==").{1,10}$/) |
(?!x) | 分组匹配不是x之前的字符串并记录 | |
(?<!x) | 分组匹配不是x之后的字符串并记录 | |
(?<name>x) | 分组匹配x并放到name的组中 | |
x$ | 匹配任何结尾为 x 的字符串 | |
^x | 匹配任何开头为 x 的字符串 |
注意()中会当做一个原子来看待
三、方法
1、RegExp对象属性
1、global
/abc/g.test('abcedf')
//true
2、ignoreCase
/abc/gi.test('ABcedf')
//true
3、multiline
/abc/gim.test('abc\n')
//true
4、source
/abc/g.source
//返回abc
2、RegExp 对象的方法
compile、exec、test、toString.
/abc/.exec("abcde");
// "abc"
/abc/.test("abcde");
//true
/abc/.toString();
//"/abc/"
var reg = /abc/; reg.compile("def");
reg.test("def");
//true
3、支持正则表达式的 String 对象的方法
search、match、replace、split
'abcabcdef'.search(/(abc)\1/);
//0
"aabbbcc".replace(/b+?/, "1");
//"aa1bbcc"
"aabbc".replace(/b*?/g, "1");
//"1a1a1b1b1c1"
"aabbbbccbbc".match(/b+/g);
//["bbbb", "bb"]
"aabbbccbbaabbdd".split(/b+/g);
//["aa", "cc", "aa", "dd"]
四、应用
之前项目中,有需要把数字,每三个数字加一个逗号,先自己写了个有循环的方法,在去网上查,发现只要一条正则就可以解决
function toThousands(num) {
return (num || 0).toString().replace(/(\d)(?=(?:\d{3})+$)/g, '$1,');
}
function myFun(num) {
return (num || 0).toString().replace(/b*?(?=(\d{3})+$)/g, ",").replace(/^,/, '');
}
第一函数是网上查来的,replace第二个参数中$1匹配正则中第一个记录的()中字符。
参考所学的正则知识,自己手写了第二个myFun函数,意思是以3个数字结尾的前面加“,”,但是不能取消开头的,只能写两个正则。