正则表达式,又称规则表达式。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。在js中提供了一个RegExp对象来表示正则表达式 。
语法: var patt=new RegExp(pattern,modifiers); 或者 var patt=/pattern/modifiers; 模式( pattern )描述了一个表达式模型,修饰符(modifiers)描述了检索是否是全局,区分大小写等。
RegExp 模式:
方括号:
方括号用于查找某个范围内的字符:
表达式 | 描述 |
---|---|
[abc] | 查找方括号之间的任何字符。 |
[^abc] | 查找任何不在方括号之间的字符。 |
[0-9] | 查找任何从 0 至 9 的数字。 |
[a-z] | 查找任何从小写 a 到小写 z 的字符。 |
[A-Z] | 查找任何从大写 A 到大写 Z 的字符。 |
[A-z] | 查找任何从大写 A 到小写 z 的字符。 |
[adgk] | 查找给定集合内的任何字符。 |
[^adgk] | 查找给定集合外的任何字符。 |
(red|blue|green) | 查找任何指定的选项。 |
元字符:
元字符(Metacharacter)是拥有特殊含义的字符:
元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符。 |
\w | 查找单词字符。 |
\W | 查找非单词字符。 |
\d | 查找数字。 |
\D | 查找非数字字符。 |
\s | 查找空白字符。 |
\S | 查找非空白字符。 |
\b | 匹配单词边界。 |
\B | 匹配非单词边界。 |
\0 | 查找 NUL 字符。 |
\n | 查找换行符。 |
\f | 查找换页符。 |
\r | 查找回车符。 |
\t | 查找制表符。 |
\v | 查找垂直制表符。 |
\xxx | 查找以八进制数 xxx 规定的字符。 |
\xdd | 查找以十六进制数 dd 规定的字符。 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符。 |
量词:
量词 | 描述 |
---|---|
n+ | 匹配任何包含至少一个 n 的字符串。 |
n* | 匹配任何包含零个或多个 n 的字符串。 |
n? | 匹配任何包含零个或一个 n 的字符串。 |
n{X} | 匹配包含 X 个 n 的序列的字符串。 |
n{X,Y} | 匹配包含 X 或 Y 个 n 的序列的字符串。 |
n{X,} | 匹配包含至少 X 个 n 的序列的字符串。 |
n$ | 匹配任何结尾为 n 的字符串。 |
^n | 匹配任何开头为 n 的字符串。 |
?=n | 匹配任何其后紧接指定字符串 n 的字符串。 |
?!n | 匹配任何其后没有紧接指定字符串 n 的字符串。 |
RegExp 修饰符:
修饰符用于执行是否区分大小写和全文的搜索。 i - 修饰符是用来执行不区分大小写的匹配。g - 修饰符是用于执行全文的搜索(而不是在找到第一个就停止查找,而是找到所有的匹配)。 m - 执行多行匹配。
RegExp 对象属性:
//global 属性用于返回正则表达式是否具有标志 "g"。它声明了给定的正则表达式是否执行全局匹配。//如果 g 标志被设置,则该属性为 true,否则为 false。var reg=RegExp('t');reg.global;//false//ignoreCase 属性规定是否设置 "i" 标志。如果设置了 "i" 标志,则返回 true,否则返回 false。reg.ignoreCase;//false//lastIndex 属性用于规定下次匹配的起始位置。该属性是可读可写的。只要目标字符串的下一次搜索开始,//就可以对它进行设置。当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。//不具有标志 g 和不表示全局模式的 RegExp 对象不能使用 lastIndex 属性。//如果在成功地匹配了某个字符串之后就开始检索另一个新的字符串,需要手动地把这个属性设置为 0。var str = "The rain in Spain stays mainly in the plain";var patt = new RegExp("ain", "g");patt.test(str);//truepatt.lastIndex;//8patt.lastIndex=10;//10patt.test(str);//truepatt.lastIndex;//17//multiline 属性用于返回正则表达式是否具有标志 m。它声明了给定的正则表达式是否以多行模式执行模式匹配。//在这种模式中,如果要检索的字符串中含有换行符,^ 和 $ 锚除了匹配字符串的开头和结尾外还匹配每行的开头和结尾。//如果 m 标志被设置,则该属性为 true,否则为 false。reg.multiline;//false//source 属性用于返回模式匹配所用的文本。该文本不包括正则表达式直接量使用的定界符,也不包括标志 g、i、m。reg.source;//"t"
RegExp 对象方法:
//exec() 方法用于检索字符串中的正则表达式的匹配。返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null//exec()功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为//复杂。如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。//此数组的第 1 个元素是与正则表达式相匹配的文本,第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本//(如果有的话),第 3 个元素是与 RegExpObject 的第 3 个子表达式相匹配的文本(如果有的话),以此类推。//除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。//input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec() 方法时,//返回的数组与调用方法 String.match() 返回的数组是相同的。var str = "The rain in Spain stays mainly in the plain";var reg=RegExp('t');var rexec=reg.exec(str);rexec.length;//1rexec.input;//"The rain in Spain stays mainly in the plain"rexec;//Array [ "t" ]//当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。//它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() //找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的//下一个位置。这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的//文本时,它将返回 null,并把 lastIndex 属性重置为 0。//如果在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。//无论 RegExpObject 是否是全局模式,exec() 都会把完整的细节添加到它返回的数组中。这就是 exec() 与 //String.match() 的不同之处,后者在全局模式下返回的信息要少得多。因此我们可以这么说,在循环中反复地调用 exec()//方法是唯一一种获得全局模式的完整模式匹配信息的方法。var reg2=RegExp('t','ig');var rexec2=reg2.exec(str);rexec2;//Array [ "T" ]reg2.lastIndex;//1var rexec3=reg2.exec(str);rexec3;//Array [ "t" ]reg2.lastIndex;//20var rexec4=reg2.exec(str);rexec4;//Array [ "t" ]reg2.lastIndex;//35var rexec5=reg2.exec(str);rexec5;//nullreg2.lastIndex;//0//test() 方法用于检测一个字符串是否匹配某个模式.如果字符串 string 中含有与 模式 匹配的文本,则返回 true,//否则返回 false。调用 RegExp 对象的 test() 方法,并为它传递字符串 s,//与这个表示式是等价的:(r.exec(s) != null)。reg2.test(str);//true//compile() 方法用于在脚本执行过程中编译正则表达式。compile() 方法也可用于改变和重新编译正则表达式。//RegExpObject.compile(regexp,modifier);regexp是正则表达式。modifier规定匹配的修饰符。var str="Every man in the world! Every woman on earth!";var patt=/man/g;var str2=str.replace(patt,"person");str2;//"Every person in the world! Every woperson on earth!"patt=/(wo)?man/g;patt.compile(patt);str3=str.replace(patt,'person');str3;//"Every person in the world! Every person on earth!"
支持正则表达式的 String 对象的方法: search , match , replace , split 。