ECMAScript 通过 RegExp 类型来支持正则表达式。
语法: var expression = / pattern / flags ;
其中的模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类、限定符、分组、向前查找以及反向引用。每个正则表达式都可带有一或多个标志(flags),用以标明正则表达式的行为。正则表达式的匹配模式支持下列 3 个标志:
- g :表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即停止;
var zw="zwzwzw";
t1 =/zw/g;
t2 =/zw/;
f1= zw.match(t1);
console.log(f1);
f2= zw.match(t2);
console.log(f2);
如果没有g,在正则过程中,字符串是从左至右匹配的,如果匹配成功就不再继续向右匹配了,如果你带g,它会重头到尾的把正确匹配的字符串挑选出来。
- i :表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
- m :表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模式匹配的项。
与其他语言中的正则表达式类似,模式中使用的所有元字符都必须转义。正则表达式中的元字符包括:
( [ { \ ^ $ | ) ? * + .]}
//匹配第一个" [bc]at",不区分大小写
var pattern2 = /\[bc\]at/i;
另一种创建正则表达式的方式是使用RegExp 构造函数,它接收两个参数:一个是要匹配的字符串模式,另一个是可选的标志字符串。可以使用字面量定义的任何表达式,都可以使用构造函数来定义,如下面的例子所示。
//匹配第一个"bat"或"cat",不区分大小写
var pattern1 = /[bc]at/i;
//与 pattern1 相同,只不过是使用构造函数创建的
var pattern2 = new RegExp("[bc]at", "i");
在此, pattern1 和 pattern2 是两个完全等价的正则表达式。要注意的是,传递给 RegExp 构造函数的两个参数都是字符串(不能把正则表达式字面量传递给 RegExp 构造函数)。由于 RegExp 构造函数的模式参数是字符串,所以在某些情况下要对字符进行双重转义。所有元字符都必须双重转义,那些已经转义过的字符也是如此。
正则表达式模式
1.方括号用于查找某个范围内的字符
2.元字符是拥有特殊含义的字符
3.量词
特殊字符
若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。
语法 | 含义 |
* | 匹配前面的子表达式零次或多次 |
+ | 匹配前面的子表达式一次或多次 |
? | 匹配前面的子表达式一次或0次 |
( ) | 标记一个子表达式的开始和结束位置 |
^ | 匹配输入字符串的开始位置 |
$ | 匹配输入字符串的结尾位置 |
. | 匹配除换行符 \n 之外的任何单字符 |
{ | 标记限定符表达式的开始 |
| | 指明两项之间的一个选择 |
[ | 标记一个中括号表达式的开始 |
\ | 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符 |
限定符
语法 | 含义 |
* | 匹配前面的子表达式零次或多次 |
+ | 匹配前面的子表达式一次或多次 |
? | 匹配前面的子表达式零次或一次 |
{n} | n 是一个非负整数,匹配确定的 n 次 |
{n,} | n 是一个非负整数,至少匹配n 次 |
{n,m} | m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次 |
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
*、+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
如下
var zw="zzzz";
t1 =/z?/;
t2 =/z*/;
f1= zw.match(t1);
console.log(f1);
f2= zw.match(t2);
console.log(f2);
发现一个写法的等价性,这三种写法效果是等价的
[abc] | [a|b|c] | (a|b|c) |
var zz=/(c|b|a)at/;
f2=zz.test("cbaat");
console.log(f2);
var zz=/[c|b|a]at/;
f2=zz.test("cbaat");
console.log(f2);
var zz=/[cba]at/;
f2=zz.test("cbaat");
console.log(f2);
但是!!!/(cba)at/与这个三种写法不等价,它表示的是匹配的子模式中为cba,否则返回false
var zz=/(cba)at/;
f2=zz.test("cbaat");
console.log(f2);
正则表达式中常见元字符
\d : 0-9之间的任意一个数字 \d只占一个位置
\w : 数字,字母 ,下划线 0-9 a-z A-Z _
\s : 空格或者空白等
\D : 除了\d
\W : 除了\w
\S : 除了\s
. : 除了\n之外的任意一个字符
\ : 转义字符
| : 或者
() : 分组
\n : 匹配换行符
\b : 匹配边界 字符串的开头和结尾 空格的两边都是边界 => 不占用字符串位数
^ : 限定开始位置 => 本身不占位置
$ : 限定结束位置 => 本身不占位置
[a-z] : 任意字母 []中的表示任意一个都可以
[^a-z] : 非字母 []中^代表除了
[abc] : abc三个字母中的任何一个
[^abc]除了这三个字母中的任何一个字符
RegExp 的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息。
一、RegExp 实例属性
1.global :布尔值,表示是否设置了 g 标志。
2. ignoreCase :布尔值,表示是否设置了 i 标志。
3. lastIndex :整数,表示开始搜索下一个匹配项的字符位置,从 0 算起。
4. multiline :布尔值,表示是否设置了 m 标志。
5. source :正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。
二、RegExp 实例方法
RegExp 对象的主要方法是 exec() ,该方法是专门为捕获组而设计的。 exec() 接受一个参数,即要应用模式的字符串,然后返回包含第一个匹配项信息的数组;或者在没有匹配项的情况下返回 null 。返回的数组虽然是 Array 的实例,但包含两个额外的属性: index 和 input 。其中, index 表示匹配项在字符串中的位置,而 input 表示应用正则表达式的字符串。在数组中,第一项是与整个模式匹配的字符串,其他项是与模式中的捕获组匹配的字符串(如果模式中没有捕获组,则该数组只包含一项)。
var text = "mom and dad and baby";
var pattern = /mom( and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
alert(matches.index); // 0
alert(matches.input); // "mom and dad and baby"
alert(matches[0]); // "mom and dad and baby"
alert(matches[1]); // " and dad and baby"
alert(matches[2]); // " and baby
对于 exec() 方法而言,即使在模式中设置了全局标志( g ),它每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用 exec() 将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用 exec() 则都会在字符串中继续查找新匹配项。如下所示:zw1只会匹配到zw,而zw2第二次会匹配到 w。.表示匹配除\n之外的任意单字符,空格也包括在内,ww前面有空格,所以得到的结果是这样。
var text = "zw, ww, www,";
var zw1 = /.w/;
var te = zw1.exec(text);
console.log(te.index);
console.log(te[0]);
console.log(zw1.lastIndex);
te = zw1.exec(text);
console.log(te.index);
console.log(te[0]);
console.log(zw1.lastIndex);
var zw2 = /.w/g;
var te = zw2.exec(text);
console.log(te.index);
console.log(te[0]);
console.log(zw2.lastIndex);
te = zw2.exec(text);
console.log(te.index);
console.log(te[0]);
console.log(zw2.lastIndex);
lastIndex:是一个可读/写的整数,如果匹配模式中带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置。
test( )方法,它的参数是一个字符串,用test( )对某个字符串进行检测,如果包含正则表达式的一个匹配结果,则返回true,否则返回false。
exec与test方法都是RegExp对象的方法,区别:test方法返回的是布尔值,而exec方法返回的是一个数组,其中存放匹配的结果。
var zw="zzzz";
t1 =/z?/;
f1= t1.test(zw);
console.log(f1);
f2= t1.exec(zw);
console.log(f2);
RegExp 实例继承的 toLocaleString() 和 toString() 方法都会返回正则表达式的字面量,与创建正则表达式的方式无关。
正则表达式的 valueOf() 方法返回正则表达式本身。
三、RegExp 构造函数属性(感觉作用不大)
这些属性分别有一个长属性名和一个短属性名
使用这些属性可以从 exec() 或 test() 执行的操作中提取出更具体的信息。
var text = "this has been a short summer";
var pattern = /(.)hort/g;
/*
* 注意:Opera 不支持 input、lastMatch、lastParen 和 multiline 属性
* Internet Explorer 不支持 multiline 属性
*/
if (pattern.test(text)){
alert(RegExp.input); // this has been a short summer
alert(RegExp.leftContext); // this has been a
alert(RegExp.rightContext); // summer
alert(RegExp.lastMatch); // short
alert(RegExp.lastParen); // s
alert(RegExp.multiline); // false
}
自己写了一个验证邮箱的正则表达式,验证通过了,开心!
var zw="12345678@qq.com";
t1 =/[1-9][0-9]{3,10}@qq\.com/;
f1= t1.test(zw);
console.log(f1);