目录
概述
正则表达式描述了一种字符串匹配的模式,通常用于检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的字串等。简单来说,正则就是匹配模式,用于匹配字符或者匹配位置。
语法
首先我们先了解JavaScript中的RegExp对象,RegExp是正则表达式的简写,是用于创建正则对象的方法之一。正则对象的创建方法如下:
●var 变量名 = /表达式/修饰符
●var 变量名 = new RegExp(/表达式/修饰符)
修饰符
修饰符用于执行区分大小写和全局匹配,常用的修饰符如下
修饰符 | 作用 |
i | 忽略大小写 |
g | 在目标字符串中实现全局匹配 |
m | 实现多行匹配 |
范围符
范围符通常用于指定查找字符的范围
表达式 | 描述 |
^ | 匹配行首文本 |
$ | 匹配行尾文本 |
[字符串] | 查找方括号之间的任意字符 |
[^字符串] | 查找任意不在方括号之间的字符 |
(字符串1|字符串2|字符串3) | 查找任意指定的选项 |
元字符
元字符是拥有特殊含义的字符
符号 | 描述 | 符号 | 描述 |
\w | 匹配数字、字母、下划线(=[a-zA-Z0-9]) | \d | 匹配0-9之间的任意数字(=[0-9]) |
\W | 匹配除了数字、字母、下划线的字符(=[^a-zA-Z0-9]) | \D | 匹配除了0-9之间的任意字符(=[^0-9]) |
\s | 匹配空白符(例如换行符、制表符、空格符等)(=[\t\r\n\v\f]) | \b | 匹配单词分界符 |
\S | 匹配非空白符(=[^\t\r\n\v\f]) | \B | 非单词分界符 |
. | 匹配除"\n"外的任意单个字符 | \0 | 匹配NULL字符 |
\n | 匹配换行符 | \f | 匹配换页符 |
\r | 匹配回车符 | \t | 匹配制表符 |
\v | 匹配垂直制表符 | \xxx | 匹配以八进制数xxx规定的字符 |
\xdd | 匹配以十六进制数dd规定的字符 | \uxxxx | 匹配以十六进制数xxxx规定的Unicode字符 |
量词符
量词符用于规定某个模式匹配次数
量词 | 描述 | 量词 | 描述 |
+ | 匹配+前面的字符1次或多次 | n{x,} | 匹配{}前面的字符至少x次 |
* | 匹配*前面的字符0次或多次 | n{x,y} | 匹配{}前面的字符至少x次至多y次 |
? | 匹配?前面的字符0次或1次 | ?=n | 匹配任何其后紧接指定字符串n的字符串 |
n{x} | 匹配{}前面的字符x次 | ?!n | 匹配任何其后没有紧接指定字符串n的字符串 |
RegExp对象方法
方法 | 描述 |
exec() | 用于检索字符串中的正则表达式匹配,有则返回匹配值,反之返回null |
test() | 用于检测一个字符串是否匹配某个模式,有匹配的值返回true,反之返回false |
tostring() | 返回正则表达式的字符串 |
创建检索字符串和正则对象:
var str = 'abcde';
// 创建正则对象
var reg1 = /bc/g;
var reg2 = /bu/g;
检索字符串中指定的值并返回方法:
// 检索字符串中指定的值并返回
document.write(reg1.exec(str)); //bc
document.write("<br>",reg2.exec(str)); //null
检索字符串中指定的值方法:
// 检索字符串中指定的值
document.write("<br>",reg1.test(str)); //true
document.write("<br>",reg2.test(str)); //false
返回正则表达式的字符串方法:
// 返回正则表达式的字符串
document.write("<br>",reg1.toString()); // /bc/g
document.write("<br>",reg2.toString()); // /bu/g
需要注意的是,exec()和test()方法不能同时使用。如果先使用exec()再使用test(),exec()方法能正常使用,test()使用出错,无论是否找到检索字符串中指定的值,都返回false;如果先使用test()再使用exec(),test()方法能正常使用,exec()使用出错,无论是否找到检索字符串中指定的值,都返回null
string对象方法
方法 | 描述 |
search() | 检索与正则表达式相匹配值,没找到返回-1 |
match() | 找到一个或多个正则表达式匹配 |
replace() | 替换与正则表达式匹配的子串 |
split() | 将字符串分割为字符串数组 |
search()方法:
该方法返回的值是指定查找的字符串或者正则表达式相匹配的string对象起始位置,起始位置从0开始,需要注意的是对空白符敏感,空白符也计入查找
var str = "abcde";
document.write(str.search('cde')); //2
document.write("<br>",str.search('abc')); //0
document.write("<br>",str.search('a23')); //-1
match()方法:
该方法可以在字符串内检索指定的值,或找到一个或者多个正则表达式的匹配,返回的是找到的值
var str = "AaBbAaCcAa";
// 全局匹配不分大小写的a字母
document.write(str.match(/a/gi)); //A,a,A,a,A,a
replace()方法:
该方法用于在字符串中用指定字符替换另一些字符,或者替换一个与正则表达式匹配的字串
var str = "abcdefCdgcDhCD";
// 全局替换,忽略大小写
document.write(str.replace(/cd/gi,123)); //ab123ef123g123h123
split()方法:
该方法用于将一个字符串分割成字符串数组,该方法不会改变原始字符串。与上面不同的是,该方法多了一个可选参数:
split(separator,limit)
separator:可选,分割参数,从该参数指定的地方进行分割
limit:可选,返回指定数组最大长度
var str = "Today is a nice day!";
// 省略分割参数
document.write(str.split()); //Today is a nice day!
// 分割每个字符,包括空格
document.write("<br>",str.split("")); //T,o,d,a,y, ,i,s, ,a, ,n,i,c,e, ,d,a,y,!
// 以空格作为分割参数
document.write("<br>",str.split(" ")); //Today,is,a,nice,day!
// 以空格作为分割参数,并限制返回长度最大为3
document.write("<br>",str.split(" ",3)); //Today,is,a
// 以字符i作为分隔符
document.write("<br>",str.split("i")); //Today ,s a n,ce day!
RegExp对象属性
属性 | 描述 |
constructor | 返回创建RegExp对象的构造函数 |
global | 判断是否设置修饰符'g' |
ignoreCase | 判断是否设置修饰符'i' |
multiline | 判断是否设置修饰符'm' |
source | 返回正则表达式匹配模式 |
lastIndex | 规定下次匹配的起始位置(该属性只有设置标志g才能使用) |
测试情况:
var reg1 = new RegExp("abcde",'gim');
var reg2 = /abc123/;
//返回创建RegExp对象的构造函数
document.write(reg1.constructor); //function RegExp() { [native code] }
document.write("<br>",reg2.constructor); //function RegExp() { [native code] }
//判断是否设置修饰符'g'
document.write("<br>",reg1.global); //true
document.write("<br>",reg2.global); //false
//判断是否设置修饰符'i'
document.write("<br>",reg1.ignoreCase); //true
document.write("<br>",reg2.ignoreCase); //false
//判断是否设置修饰符'm'
document.write("<br>",reg1.multiline); //true
document.write("<br>",reg2.multiline); //false
//返回正则表达式匹配模式
document.write("<br>",reg1.source); //abcde
document.write("<br>",reg2.source); //abc123
对于lastIndex属性,该属性用于规定下次匹配次数,上一次的匹配结果是由方法RegExp.exec() 和 RegExp.test() 找到的,它们是以lastIndex属性所指的位置作为下次检索的起始点。反复调用这两个方法,可以遍历一个字符串中的所有匹配文本。
注意点:该属性只有设置标志g才可以使用;该属性是可读可写的,只要目标字符串的下一次搜索开始,就可以对它进行设置。当方法RegExp.exec() 和 RegExp.test()找不到可以匹配的文本,会自动将lastIndex属性重置为0.
var str = "abcde 123ab c456bcde789bc";
var reg = /bc/g;
// 遍历字符串str中对reg匹配文本
while(reg.test(str) === true){
document.write(reg.lastIndex);
document.write("<br>")
}
/* 输出结果:
3
18
25 */
优先级关系
正则表达式符号也有优先级,由高到低排序如下所示:
符号 | 说明 |
\ | 转义符 |
()、(?)、(?=)、[] | 圆括号与中括号 |
*、+、?、{x}、{x,}、{x,y} | 限定符 |
^、$、\任意元字符、\任意字符 | 定位点、序列 |
| | “或”操作 |