本文详解JavaScript中正则表达式的创建方式,包括文本格式与RegExp构造函数。系统梳理了匹配特殊字符、边界符及量词的含义,并介绍了exec、test等核心方法以及全局匹配、忽略大小写等属性,帮助开发者掌握字符串模式匹配技巧。
JavaScript正则表达式详解:语法、属性与方法
JavaScript中的正则表达式解析 正则表达式(regular expression)对象包含一个正则表达式模式(pattern)。它具备利用该模式去匹配或替换字符串(string)中特定字符(或字符集合)的属性(properties)和方法(methods)。若需为单独的正则表达式添加属性,可使用正则表达式构造函数(constructor function)。无论何时调用,预置的正则表达式对象(RegExp object)都会设置静态属性(the predefined RegExp object has static properties that are set whenever any regular expression is used)。 创建方式主要有两种:文本格式或正则表达式构造函数。 文本格式:/pattern/flags 正则表达式构造函数:new RegExp("pattern"[,"flags"]) 参数说明如下: pattern:代表一个正则表达式文本。 flags:若存在,可选值包括: g:全局匹配。 i:忽略大小写。 gi:上述两者的组合。 [注意] 文本格式的参数无需使用引号,而使用构造函数时参数必须加引号。例如:/ab+c/i 与 new RegExp("ab+c","i") 实现的功能相同。 在构造函数中,部分特殊字符需要进行转义(即在特殊字符前加"\")。例如:re = new RegExp("\\w+") 正则表达式中的特殊字符含义如下: \:作为转义字符,即通常在"\"后面的字符不按原意解释。例如 /b/ 匹配字符"b",而在b前加反斜杠后 /\b/ 则转意为匹配一个单词的边界。 -或-:对正则表达式功能字符进行还原。例如"*"匹配其前面元字符0次或多次,/a*/ 将匹配a, aa, aaa;若加上"\",则 /a\*/ 仅匹配"a*"。 ^:匹配输入或一行的开头,/^a/ 匹配"an A",而不匹配"An a"。 $:匹配输入或一行的结尾,/a$/ 匹配"An a",而不匹配"an A"。 *:匹配前面元字符0次或多次,/ba*/ 将匹配b, ba, baa, baaa。 +:匹配前面元字符1次或多次,/ba*/ 将匹配ba, baa, baaa。 ?:匹配前面元字符0次或1次,/ba*/ 将匹配b, ba。 (x):匹配x并保存x在名为$1...$9的变量中。 x|y:匹配x或y。 {n}:精确匹配n次。 {n,}:匹配n次以上。 {n,m}:匹配n-m次。 [xyz]:字符集(character set),匹配该集合中的任一字符(或元字符)。 [^xyz]:不匹配该集合中的任何一个字符。 [\b]:匹配一个退格符。 \b:匹配一个单词的边界。 \B:匹配一个单词的非边界。 \cX:此处X是一个控制符,/\cM/ 匹配Ctrl-M。 \d:匹配一个字数字符,/\d/ 等同于 /[0-9]/。 \D:匹配一个非字数字符,/\D/ 等同于 /[^0-9]/。 \n:匹配一个换行符。 \r:匹配一个回车符。 \s:匹配一个空白字符,包括\n, \r, \f, \t, \v等。 \S:匹配一个非空白字符,等于/[^\n\f\r\t\v]/。 \t:匹配一个制表符。 \v:匹配一个垂直制表符。 \w:匹配一个可以组成单词的字符(alphanumeric,此处为意译,含数字),包括下划线,如[\w]匹配"$5.98"中的5,等同于[a-zA-Z0-9]。 \W:匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等同于[^a-zA-Z0-9]。 接下来通过实际应用的例子来展示正则表达式: E-mail地址验证: function test_email(strEmail) { var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/; if(myReg.test(strEmail)) return true; return false; } HTML代码的屏蔽 function mask_HTMLCode(strInput) { var myReg = /<(\w+)>/; return strInput.replace(myReg, "<$1>"); } 正则表达式对象的属性及方法 预定义的正则表达式拥有以下静态属性:input, multiline, lastMatch, lastParen, leftContext, rightContext和$1到$9。 其中input和multiline可以预设置。其他属性的值在执行过exec或test方法后被根据不同条件赋以不同的值。 许多属性同时拥有长和短(perl风格)的两个名字,并且,这两个名字指向同一个值。(JavaScript模拟perl的正则表达式) 正则表达式对象的属性: $1...$9:如果它(们)存在,是匹配到的子串。 $_:参见input。 $*:参见multiline。 $&:参见lastMatch。 $+:参见lastParen。 $`:参见leftContext。 $’:参见rightContext。 constructor:创建一个对象的一个特殊的函数原型。 global:是否在整个串中匹配(bool型)。 ignoreCase:匹配时是否忽略大小写(bool型)。 input:被匹配的串。 lastIndex:最后一次匹配的索引。 lastParen:最后一个括号括起来的子串。 leftContext:最近一次匹配以左的子串。 multiline:是否进行多行匹配(bool型)。 prototype:允许附加属性给对象。 rightContext:最近一次匹配以右的子串。 source:正则表达式模式。 lastIndex:最后一次匹配的索引。 正则表达式对象的方法: compile:正则表达式比较。 exec:执行查找。 test:进行匹配。 toSource:返回特定对象的定义(literal representing),其值可用来创建一个新的对象。重载Object.toSource方法得到的。 toString:返回特定对象的串。重载Object.toString方法得到的。 valueOf:返回特定对象的原始值。重载Object.valueOf方法得到