标签:
1.修饰符
g : global 全文搜索,不添加,搜索到第一个匹配停止
i : ignore case 忽略大小写,默认大小写敏感
m : multiple lines 多行搜索
2.元字符
正则表达式由两种基本字符类型组成:
-原义文本字符
-元字符
元字符是在正则表达式中由特殊含义的非字母字符
* + ? $ ^ . | \ ( ) { } [ ]
字符 | 含义 |
\t | 水平制表符 |
\v | 垂直制表符 |
\n | 换行符 |
\r | 回车符 |
\0 | 空字符 |
\f | 换页符 |
\cX | 与X对应的控制字符(Ctrl + X) |
3.字符类
我们可以使用元字符[]来构建一个简单的类
所谓类是指符合某些特性的对象,一个泛指,而不是特指某个字符
表达式[abc]把字符 a 或 b 或 c 归为一类,表达式可以匹配这类的字符
4.字符类取反
使用元字符 ^ 创建反向类/负向类
反向类的意思是不属于某类的内容
表达式[^abc]表示 不是字符a或b或c的内容
5.范围类
使用[a-z]来连接两个字符表示从a到z 的任意字符
这是个闭区间,也就是包含a和z本身
在[]组成的类内部是可以连写的[a-zA-Z]
>‘a1b2c3d4e5‘.replace(/[a-z]/g,‘Q‘)
<"Q1Q2Q3Q4Q5"= $2
>‘a1b2c3d4e5A1B2C3D4E5‘.replace(/[a-zA-Z]/g,‘Q‘)
<"Q1Q2Q3Q4Q5Q1Q2Q3Q4Q5"= $3
>‘2016-09-12‘.replace(/[0-9]/g,‘Q‘)
<"QQQQ-QQ-QQ"= $4
>‘2016-09-12‘.replace(/[0-9-]/g,‘Q‘)
<"QQQQQQQQQQ"= $5
6.预定义类
字符 | 等价类 | 含义 |
. | [^\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] | 非单词字符 |
匹配一个 ab+数字+任意字符 的字符串
ab[0-9][^\r\n] or ab\d.
7.边界
常用边界匹配字符
字符 | 含义 |
^ | 以xxx开始 |
$ | 以xxx结束 |
\b | 单词边界 |
\B | 非单词边界 |
>‘@123@abc@‘.replace(/@./g,‘Q‘)
<"Q23Qbc@"= $1
>‘@123@abc@‘.replace(/^@./g,‘Q‘)
<"Q23@abc@"= $2
>‘@123@abc@‘.replace(/.@$/g,‘Q‘)
<"@123@abQ"= $3
8.量词
字符 | 含义 |
? | 出现零次或一次(最多出现一次) |
+ | 出现一次或多次(至少出现一次) |
* | 出现零次或多次(任意次) |
{n} | 出现n次 |
{n,m} | 出现n到m次 |
{n,} | 至少出现n次 |
9.非贪婪模式
让正则表达式尽可能少的匹配,也就是说一旦成功匹配不再继续尝试就是非贪婪模式
做法很简单,在量词后加上?即可
‘123456789‘.match(/\d{3,5}?/g) ——> {"123","456","789"}
10.分组
使用()可以达到分组的功能,使量词作用于分组(Byron){3}
>‘a1b2c3d4‘.replace(/[a-z]\d{3}/g,‘X‘)
<"a1b2c3d4"= $1
>‘a1b2c3d4‘.replace(/([a-z]\d){3}/g,‘X‘)
<"Xd4"= $2
使用 | 可以达到 或 的效果
>‘ByronCasper‘.replace(/Byron|Casper/g,‘X‘)
<"XX"= $1
>‘ByronsperByrCasper‘.replace(/Byr(on|Ca)sper/g,‘X‘)
<"XX"= $1
反向引用
2015-12-25 => 12/25/2015
> ‘2015-12-25‘.replace(/(\d{4})-(\d{2})-(\d{2})/g,‘$2/$3/$1‘)
<"12/25/2015"= $1
忽略分组
--不希望捕获某些分组,只需要在分组内加上?: 就可以 (?:Byron)
11.前瞻
前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言,后顾则相反。
名称 | 正则 | 含义 |
正向前瞻 | exp(?=assert) | |
负向前瞻 | exp(?!assert) |
>‘a2*3‘.replace(/\w(?=\d)/g,‘X‘)
<"X2*3"= $1
>‘a2*34v8‘.replace(/\w(?=\d)/g,‘X‘)
<"X2*X4X8"= $2
>‘a2*34vv‘.replace(/\w(?=\d)/g,‘X‘)
<"X2*X4vv"= $3
>‘a2*34vv‘.replace(/\w(?!\d)/g,‘X‘)
<"aX*3XXX"= $5
12.对象属性
global 是否全文搜索,默认false
ignore case 是否大小写敏感,默认使false
multiple lines 多行搜索,默认值使false
lastIndex 是当前表达式匹配内容的最后一个字符的下一个位置
source 正则表达式的文本字符串
var reg =/\d(\w)(\w)\d/;
var reg2 =/\d(\w)(\w)\d/g;
var ts =‘$1az2bb3cy4dd5ee‘;
var ret = reg.exec(ts)
while(ret = reg2.exec(ts)){
console.log(reg2.lastIndex +‘\t‘+ ret.index +‘\t‘+ ret.toString());
};
//1511az2,a,z
//11173cy4,c,y
var reg =/\d(\w)(\w)\d/;
var reg2 =/\d(\w)\d/g;
var ts =‘$1az2bb3cy4dd5ee‘;
var ret = reg.exec(ts)
console.log(reg.lastIndex +‘\t‘+ ret.index +‘\t‘+ ret.toString());
console.log(reg.lastIndex +‘\t‘+ ret.index +‘\t‘+ ret.toString());
var reg =/\d(\w)\d/;
var reg2 =/\d(\w)\d/g;
var ts =‘$1a2b3c4d5e‘;
var ret = ts.match(reg);
console.log(ret);
console.log(ret.index +‘\t‘+ reg.lastIndex);
["1a2","a", index:1, input:"$1a2b3c4d5e"]0:"1a2"1:"a"index:1input:"$1a2b3c4d5e"length:2__proto__:Array[0]
10
‘a,b,c,d‘.split(‘,‘);//["a","b","c","d"]
‘a1b2c3d‘.split(/\d/);//["a","b","c","d"]
String.prototype.replace(str,replaceStr)
String.prototype.replace(reg,replaceStr)
String.prototype.replace(reg,function)
‘a1b2c3d4e5‘.replace(/\d/g,function(match,index,origin){
console.log(index);
return parseInt(match)+1;
});
VM358:11
VM358:13
VM358:15
VM358:17
VM358:19
"a2b3c4d5e6"
‘a1b2c3d4e5‘.replace(/(\d)(\w)(\d)/g,function(match,group1,group2,group3,index,origin){
console.log(match);
return group1 + group3;
});
VM405:11b2
VM405:13d4
"a12c34e5"
标签:
原文地址:http://www.cnblogs.com/gdeng338/p/5773591.html