js 正则表达式
JavaScript通过内置对象RegExp来支持正则表达式
两种实例化方法:
- 字面量 var reg= / \bis\b /g;
- 构造函数 new RegExp(‘’\\bis\\b,’g’); 反斜线需要转义
修饰符
g:全局匹配 (global)
i:忽略大小写 (ignore case)
m:多行匹配(multiple lines)
元字符
- 原义文本字符
- 元字符(在正则表达式中有特殊含义的非字母字符)
例如:\b 单词边界
.* + ? $ . | \ () {} []
字符 |
含义 |
\t |
水平制表符 |
\v |
垂直制表符 |
\n |
换行符 |
\r |
回车符 |
\0 |
空格符 |
\f |
换页符 |
\cX |
与X对应的控制字符(Ctrl+X) |
字符类
可以使用[]构建一个简单的类
表达式[abc]就是把abc归为一类,表达式可以匹配这类的字符
‘a1b2c3’.replace(/[abc]/g,’X’);àX1X2X3
字符类取反
[^…]
‘abcdef123’.replace(/[^abc]/g,”Q”); à”abcQQQQQQ”
范围类
[0-9]:代表0-9
[a-zA-Z]: 代表字母 在字符类里可以连续写
预定义类
字符 |
等价类 |
含义 |
. |
[^\r\n] |
除了回车和换行的所有字符 |
\d |
[0-9] |
数字类 |
\D |
[^0-9] |
非数字字符 |
\w |
[a-zA-Z0-9_] |
单词字符(字母,数字下划线) |
\W |
[^a-zA-Z0-9_] |
非单词字符 |
\s |
[\r\n\t\f\x0B] |
空白符 |
\S |
[^\r\n\t\f\x0B] |
非空白符 |
边界
字符 |
含义 |
^ |
|
$ |
|
\b |
单词边界 |
\B |
非单词边界 |
\b:
多行处理:
‘@123
@123
@123’.replace(/^@\d/g,’X’);-->
“X23
@123
@123”
‘@123
@123
@123’.replace(/^@\d/gm,’X’);-->
“X23
X23
X23”
量词
字符 |
含义(使用数学的集合表示) |
? |
{0,1} |
+ |
[1,∞) |
* |
[0, ∞) |
{n} |
{n} |
{n,m} |
[n,m] |
{n,} |
[n, ∞) |
- /\d?/ à
- /\d+/ à
3./\d*/
- /\d{5}/
贪婪模式(默认的模式)
‘12345678’.replace(/\d{3,6}/,”X”); à’X78’
系统会尽可能多的匹配,直到匹配失败
非贪婪模式
做法很简单,在量词后面加个问号 \d{3,6}?
分组
匹配dog{3}出现三次àdog{3}
使用()可以达到分组的效果 使量词作用于分组
(dog){3}
或
可以使用|达到或的效果
do(g|c)at
反向引用(分组)
‘2016-8-29’.replace( /(\d{4})-(\d{2})-(\d{2})/g , ’$1/$2/$3’);
忽略分组
如果不希望捕获分组,可以在分组内加上?:就可以
(?:dog){3}
前瞻
名称 |
正则 |
含义 |
正向前瞻 |
Exp(?=assert) |
|
负向前瞻 |
Exp(?!assert) |
|
正向后瞻 |
Exp(?<=assert) |
Javascript不支持 |
负向后瞻 |
Exp(?<!assert) |
Javascript不支持 |
/ \w( ?=\d ) /g à
对象属性
l global:是否全文搜索,默认值为false
l multiplelines:是否多行搜索,默认为false
l ignoreCase: 是否忽略大小写,默认值为false
l lastIndex:当前表达式匹配内容的最后一个字符的下一个位置
l source:正则表达式的文本内容
var exp=/is/;
exp.global(false或true为只读属性);
正则表达式的相关方法
- test方法:
regexp.test(string);
用来判断是否匹配成功
非全局搜索中,lastIndex不生效
- exec方法:
如果匹配到,就返回一个数组,否则返回null
返回的数组有两个属性:
l index:声明匹配文本的第一个字符的位置
l input:存放被检索字符串string
- 非全局调用:返回数组的第一个元素为 与正则表达式相匹配的文本,第二个为 与reg对象子表达式(分组)想匹配的文本。。。
例如:var reg=/ \d (\w) \d /;
var arr=reg.test(‘2a32m3’); àarr=[ ‘2a3’ , ’a’ ];
arr.index=0;
reg.lastIndex不起作用
- 全局调用:
- search方法
string.search(string|reg);
用于检索字符串中指定的子字符串,或检索正则表达式相匹配的子字符串
返回第一个匹配结果index,如果没有找到返回-1
该方法忽略g标志并且总是从哪个第一个字符开始搜索
- match方法
string.match(reg);
- 非全局调用:和exec方法一样
- 全局调用:返回结果数组,没有分组信息,没有index属性和input属性
- split方法
string.split(reg|string);
- string.replace(reg,function);
该函数有4个参数:
- 匹配的字符串
- 分组
- index
- 原字符串
string.replace(/\d/g,function(s){
return parseInt( s )+1;
});
string.replace(reg,string);