1. 东西
2. RegExp对象
js经由过程内置对象RegExp支撑正则,有两种要领可实例化RegExp对象。
// 字面量
var reg = /\bis\b/g;
// 组织函数
var reg = new RegExp('\\bis\\b','g');
g: global全文搜刮,默许只会找一个。
i: ignoreCase 疏忽大小写,默许大小写敏感。
m: multipe 多行。
3. 元字符
14个特殊标记;运用原义需转义。
* + ? $ ^ . | \ ( ) { } [ ]
序号 | 标记 | 申明 |
---|---|---|
1 | * | 恣意(零,一,多) |
2 | + | 一个或多个 |
3 | ? | 零个或一个 |
4 | $ | 表达式末端 |
5 | ^ | 方括号里示意取反;表达式最先 |
6 | . | 恣意字符 |
7 | | | 或 |
8 | () | 分组 |
9 | {} | 量词 |
10 | [] | 类词 |
序号 | 字符 | 申明 |
---|---|---|
1 | t | 程度制表符 tab |
2 | v | 垂直制表符 vertical tab |
3 | n | 换行符 line feed |
4 | r | 回车符 return |
5 | 0 | 空字符 null |
6 | f | 换页符 form feed |
7 | cX | ctrl+X |
4. 字符类
4.1 平常状况下正则表达式的字符和字符串的字符一一对应
ab\t
对应
abtab
4.2 给字符归类
[abc]指a,b,c之一
4.3 字符类取反
[^abc]指除了a,b,c以外的
4.4 局限类
[a-zA-Z0-9]
5. 预定义类和边境
序号 | 字符 | 等价类 | 申明 |
---|---|---|---|
1 | . | 1 | 除了回车符和换行符以外的一切字符 |
2 | d | [0-9] | 数字 |
3 | D | 2 | 非数字 |
4 | s | [tnrfv] | space 空字符 |
5 | S | 3 | 非空字符 |
6 | w | [a-zA-Z0-9_] | word 单词 数字大小写字母下划线 |
7 | W | 4 | 非单词 |
序号 | 字符 | 寄义 |
---|---|---|
1 | ^ | 以XXX最先 |
2 | $ | 以XXX末端 |
3 | b | 单词边境 |
4 | B | 非单词边境 |
6. 量词
序号 | 字符 | 寄义 |
---|---|---|
1 | * | 恣意(零,一,多) |
2 | + | 一个或多个 |
3 | ? | 零个或一个 |
4 | {m} | m次 |
5 | {m,n} | m-n次 |
6 | {m,} | 最少m次 |
7. 贪欲形式
str='12345678'.replace(/\d{3,6}/g,'$');
console.log(str);
效果:$78
默许贪欲形式,非贪欲形式是尽量少的婚配。做法是在量词背面加?
str='12345678'.replace(/\d{3,6}?/g,'$');
console.log(str);
效果:$$78
8. 分组
byron{3}婚配n三次不是byron三次。处理就是分组。
(byron){3}
和|合营运用
byr(on|en)lich{3}
反向援用捕捉组: $1 $2 …
str='2016-12-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2/$3/$1');
效果:12/25/2016
疏忽分组,在分组内加?:
(?:Byron){3}
例子:
str='byronbyronbyron'.replace(/(byron){3}/,'@$1')
"@byron"
str='byronbyronbyron'.replace(/(?:byron){3}/,'@$1')
"@$1"
9. 前瞻(可加断言)
正则表达式从文本头部向尾部最先剖析,文本尾部方向,称为“前”。
前瞻就是在正则表达式婚配到划定规矩的时刻,向前搜检是不是相符断言,后顾/后瞻方向相反。
javaScript不支撑后顾。
相符和不相符特定断言称为 一定/正向 婚配和 否认/负向 婚配。
称号 | 正则 | 例子 |
---|---|---|
正向前瞻 | exp(?=asset) | /w(?=d) |
负向前瞻 | exp(?!asset) | w(?!d) |
正向后顾 | exp(?<=asset) | 略 |
负向后顾 | exp(?<!asset) | 略 |
例子:
'a2*a3'.replace(/\w(?=\d)/g, '@')
"@2*@3"
'a2*a3'.replace(/\w(?!\d)/g, '@')
"a@*a@"
10. js对象属性
应用console.dir打印reg
var reg = /\w/;
console.dir(reg);
{
flags: "",
global: false,
ignoreCase: false,
lastIndex: 0,
multiline: false,
source: "\w",
sticky: false,
unicode: false,
__proto__: Object
}
11. RegExp的test和exec函数
11.1 test
text函数用于测试字符串参数中是不是存在婚配正则表达式形式的字符串;假如存在则返回true,不然返回false;
var reg=/\w/;
reg.test('a');true
reg.test('a');true
var reg=/\w/g;
reg.test('a');true
reg.test('a');false
涌现上面那种状况的原因是lastIndex属性;global为false时,该属性无效;global为true时,该属性会记录上一次婚配完后的位置,而且下一次查询会从该未知最先。
var reg=/\w/g;
console.log(reg.test('a'),reg.lastIndex); true 1
console.log(reg.test('a'),reg.lastIndex); false 0
所以,global为true或false对正则的婚配是两种行动。
11.2 exec
exec:运用正则表达式形式对字符串实行搜刮,并将更新全局RegExp对象的属性以反应婚配效果;假如没有婚配的文本则返回null,不然返回一个效果数组。
var reg=/\w\d/;
reg.exec('a1b2c3d4e5f6ggg');
reg.exec('a1b2c3d4e5f6ggg');
两次都返回:["a1", index: 0, input: "a1b2c3d4e5f6ggg"]
数组第一个是婚配到的效果;global为false时,只会婚配一个。
数组第二个是婚配到的效果的位置,是个对象{index:0};
数组第三个是婚配的字符串
global为true时,两次返回的效果不一样。
var reg=/\w\d/g;
reg.exec('a1b2c3d4e5f6ggg');
reg.exec('a1b2c3d4e5f6ggg');
返回:
["a1", index: 0, input: "a1b2c3d4e5f6ggg"]
["b2", index: 2, input: "a1b2c3d4e5f6ggg"]
有分组时:
var reg=/(\w)\d/g;
reg.exec('a1b2c3d4e5f6ggg');
reg.exec('a1b2c3d4e5f6ggg');
["a1", "a", index: 0, input: "a1b2c3d4e5f6ggg"]
["b2", "b", index: 2, input: "a1b2c3d4e5f6ggg"]
多了分组的数据。
平常是轮回的写法:
var ts = 'a1b2c3d4e5f6ggg'
var reg=/(\w)\d/g;
while(ret=reg.exec(ts)){
console.log(ret.toString());
}
输出
a1,a
b2,b
c3,c
d4,d
e5,e
f6,f
12. 字符串的要领
12.1 str.search
string.search(str,replaceStr);
string.search(reg,replaceStr);
12.2 str.mathch
string.match(str,replaceStr);
string.match(reg,replaceStr);
12.3 str.replace
string.replace(str,replaceStr);
string.replace(reg,replaceStr);
string.replace(reg,function);
13. 例子
// 取扩展名
const str = "http://file.xxx.com/test/2017/09/19/34457aef4a9649e2af2f1d4e9c14d0d3.mp4";
const reg = new RegExp('^http:[/\\w.]*/(\\w*).mp4$');
const result = reg.exec(str);
console.log(result[1]);// 34457aef4a9649e2af2f1d4e9c14d0d3
// 替代source标签
const str = "aaa<source src='http://file.xxx.net/ueditor/jsp/upload/video/20170922/1506081788002070202.mp4' type='video/mp4'/>bbb";
const result = str.replace(/<source[\w\s=:'.\/0-9]+\/>/g,'');
console.log(result);// aaabbb
参考:慕课网js正则