一、原子(可以分微可见原子和不可见原子)
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个数字结尾的前面加“,”,但是不能取消开头的,只能写两个正则。