正则表达式RegExp类型
一、语法
- var box = new RegExp (“参数一”); //参数一,必选*
- var box = new RegExp (“参数一”,“标记”); //标记,可选,i:不区分大小写,g:全局模式,m:多行模式。不同的匹配,得出的验证结果不一样
- var box = / pattern / flags; //pattern:任意简单或者复杂的正则表达式,flags:标记
二、实例属性
- g:global,表示全局模式,添加此修饰符表示设置了全局模式;
- i:ignorecase,设置i表示不区分大小写;
- m:multiline,多行搜索模式;
- source:正则表达式的字符串表示形式,以字面量形式来表示;
- lastIndex:搜索下一个匹配项字符的起始位置,从0开始计算。
三、RegExp实例方法
-
test()方法:在字符串中查找是否与指定正则表达式相匹配,返回布尔值。匹配,返回true;不匹配,返回false。
var pattern=/ javascript / ig;
var string="this is javascript"; document.write(pattern.test(string));
-
exec()方法:在字符串中查找指定字符串。查找成功,返回包含该字符串信息的数组;查找不成功,返回null。
var pattern=/ javascript / ig;
var string="this is javascript";
document.write(pattern.exec(string)+"<br />");
document.write(typeof pattern.exec(string)+"<br />");
在返回的数组中,第一项xxx[0]:是与整个模式相匹配的字符串;第二项xxx[1]:与第一个捕获组相匹配的字符串;第三项xxx[2]:与第二个捕获组相匹配的字符串。以此类推
多次调用exec()方法时,全局状态与非全局状态的区别
- 如果模式在一个非全局状态下,那么每一次调用exec()都会从头开始检索,始终返回第一个字符或者第一组字符.
- 说明在非全局状态下,始终都是从头开始,发现与正则表达式相匹配的字符串就会返回结果,不会继续往下查找。
var pattern=/.at/;
var string="cat,bat,sat,fat";
var matches=pattern.exec(string);
document.write(matches.index+"<br />");
document.write(matches[0]+"<br />");
document.write(matches+"<br />");
document.write(pattern.lastIndex+"<br />");
matches2=pattern.exec(string);
document.write(matches2.index+"<br />");
document.write(matches2[0]+"<br />");
document.write(matches2+"<br />");
document.write(pattern.lastIndex+"<br />");
- 如果模式在一个全局状态下,每一次调用exec()会在当前字符串中继续查找新匹配项,遍历整个字符串。
var pattern=/.at/g;
var string="cat,bat,sat,fat";
var matches=pattern.exec(string);
document.write(matches.index+"<br />");
document.write(matches[0]+"<br />");
document.write(matches+"<br />");
document.write(pattern.lastIndex+"<br />");
matches2=pattern.exec(string);
document.write(matches2.index+"<br />");
document.write(matches2[0]+"<br />");
document.write(matches2+"<br />");
document.write(pattern.lastIndex+"<br />");
四、元字符
- 正则表达式由两种字符组成:
- 原义文本字符:字符串类型
- 元字符
- 元字符时在正则表达式中有特殊含义的非字母字符
量词
字符 |
含义 |
. |
任意字符 |
* |
出现0次、1次或者多次 |
+ |
出现1次或者多次 |
? |
出现0次或者1次 |
{n} |
出现n次 |
{n,m} |
出现n至m次 |
范围类
字符 |
含义 |
[a-z] |
从a-z的任意字符,也包含a,z本身 |
[A-Z] |
从A-Z的任意字符,也包含A,Z本身 |
[0-9] |
从0-9的任意数字,也包含0,9本身 |
[a-zA-Z0-9] |
从a-zA-Z0-9的任意字符 |
预定义类
字符 |
含义 |
\d |
数字字符 |
\D |
非数字字符 |
\s |
空白符 |
\S |
非空白符 |
\w |
单词字符(字母、数字、下划线) |
\W |
非空白符 |
匹配边界的字符
字符 |
含义 |
^ |
此符号在中括号内表示“非XXX”,如果在中括号外则表示开头 |
$ |
表示结束、结尾 |
\b |
表示字符边界 |
\B |
表示非字符边界 |
分组
- 使用“()”可以达到分组的功能,使量词作用于分组,而不是紧挨着它的字符
- 表达式:/abc{3}/ 返回的结果为:abcccc,只是紧挨着量词的字符c被应用
- 表达式:/(abc){3}/返回的结果为:abcabcabc,整个字符串都被应用
- 使用“ | ”表示“或”
"ByronsperByrcasper".replace(/Btr(on|ca)sper/g,"x");
贪婪模式:尽可能多的匹配
var pattern=/\d{3,6}/;
var string="123456789";
document.write(string.replace(pattern,"X"));
非贪婪模式:尽可能少的匹配,也就是说,一组字符串中,前面有匹配成功的,那么久不回再向后搜索匹配项。
var pattern=/\d{3,6}?/;
var string="123456789";
document.write(string.replace(pattern,"X"));
RegExp.$1………9 用于存储捕获组的构造函数属性
var string="this is 'javascript'";
var pattern=/'(.*)'/;
document.write(string.replace(pattern,"<strong>$1</strong>"));
var string="2017-07-23";
var pattern=/(\d{4})-(\d{2})-(\d{2})/;
document.write(string.replace(pattern,"$3/$2/$1"));
//返回结果:23/07/2017
//在正则表达式中“(\d{4})”表示$1,“(\d{2})”表示$2,“(\d{2})”表示$3
- 忽略捕获组
- 不希望捕获某些分组,只需要在分组内加上“ ?: ”
var string="2017-07-23";
var pattern=/(\d{4})-(\d{2})-(?:\d{2})/;
document.write(string.replace(pattern,"$3/$2/$1"));