正则表达式是一种定义字符模式的方法,我们可以拆分,查找或替换字符串中与模式字符匹配的字符。
创建RegExp对象
在JavaScript中,正则表达式是通过RegExp对象使用的,RegExp对象是JavaScript中的一个内置对象,与String,Array类似。RegExp对象有自己的方法和属性,其test()方法可以测试传入的参数字符串是否匹配RegExp对象中定义的模式。可以通过两种方式创建新的RegExp对象。
一种是采用正则表达式字面量,例如:
var myRegExp=/\b'|'\b/;
其中,斜杠(/)表示正则表达式的开始和结束。这个特殊的语法告诉JavaScript,这是一个正则表达式。
另一种是使用RegExp对象的构造函数RegExp(),例如:
var myRegExp=new RegExp("\\b'|'\\b");
使用构造函数创建RegExp对象的方式允许在运行期间(在代码执行时而不是在编写代码时)确定正则表达式。例如,当正则表达式需要以用户的输入为基础时,这种方式就非常有用。
需要注意的是,在JavaScript字符串中,反斜杠表示一个转义字符。例如,\b表示退格。为了区分\b是字符串中的转义字符,还是正则表达式中的特殊字符,必须在正则表达式特殊字符之前再加一个反斜杠。因此\b就变成了\b,表示正则表达式中匹配单词分界的特殊字符,而不是退格字符。
对于所有正则表达式的特殊字符,如\w,\b,\d等,当使用构造函数RegExp()创建它们时,都必须在之前再添加一个反斜杠\。
RegExp属性
RegExp对象有三个可以定义的属性,如图所示:
属性字符 | 说明 |
---|---|
G | 全局匹配,查找所有与模式匹配的子串,而不是在找到第一个匹配的子串后就停止 |
I | 模式不区分大小写。例如,将Paul与paul视为相同的字符模式 |
M | 多行标志。指定特殊字符^和$可以匹配多行文本和字符串的开始和结束 |
使用方法与上面的创建方法对应,有两种方式。
如果想执行全局查找,并忽略大小写有如下两种方式:
var myRegExp=/content/gi;
var myRegExp=new RegExp("content","gi");
正则表达式:特殊字符
- 1.文本,数字和标点符号
第一组特殊字符包含字符类(Character class)的特殊字符。字符类指数字,字母和空白字符。特殊字符如表所示: -
字符类 匹配的字符 示例 \d 0~9的任何数字 \d\d将匹配72,但不匹配aa或者7a \D 任何非数字字符 \D\D\D匹配abc,但不匹配123或者8ef \w 任何单词字符,即A~Z,a~z,0~9,以及下划线(_)字符 \w\w\w匹配Ab_2,但不匹配$%*或者Ab_@ \W 任何非单词字符 \W匹配@,但不匹配a \s 任何空白字符 \s与制表符,回车符,换页符和竖杠匹配 \S 任何非空白字符 \S匹配A,但不匹配制表符 . 除换行符(\n)之外的任意单个字符 .匹配a或者4,或者@ […] 匹配位于方括号之内的任何一个字符,[a-z]将匹配在a~z范围内的任何字符 [abc]匹配a,b或c,但不匹配任何其他字符 [^…] 匹配除方括号内的字符之外的任何字符 [^abc]将匹配除了a,b或c之外的任何字符,[^a-z]将匹配除了a~z范围之外的任何字符 - 2.重复字符
正则表达式包含重复字符,用于指定要匹配多少个后一项或字符。 -
特殊字符 含义 示例 {n} 前一项出现n次 x{2}与xx匹配 {n,} 前一项出现n次,或者n次以上 x{2,}匹配xx,xxx,xxxx,xxxxx等 {n,m} 前一项至少出现n次,最多出现m次 x{2,4}匹配xx,xxx和xxxx ? 前一项出现0次或1次 x?匹配空串或者x + 前一项出现1次或多次 x+匹配x,xx,xxx,xxxx,xxxxx等 * 前一项出现0次或多次 x*匹配空串,或者x,xx,xxx,xxxx等 - 3.位置字符
第三组特殊字符可以指定匹配从哪里开始或结束,或者哪些字符位于字符模式的某一端。例如,有时模式应位于字符串或文本行的开始位置,有时模式应位于两个单词之间。如下表列出了最常见的位置字符及其含义: -
位置字符 描述 ^ 模式必须位于字符串的开头,如果是多行字符串,模式就位于一行的开头。对于多行文本(即包含回车符的字符串),在定义正则表达式时,需要使用/myreg ex/m设置多行标记。注意,该字符仅能用于IE5.5和NN6及其更新版本 $ 模式必须位于字符串的结束位置,如果是多行字符串,模式就位于一行的结束位置。对于多行文本(即包含回车符鹅字符串),在定义正则表达式时,需要使用/myreg ex/m设置多行标记。注意,该字符仅能用于IE5.5和NN6及其更新版本 \b 匹配单词分界位置,即单词字符与非单词字符之间的位置 \B 匹配非单词分界位置 例如,如果要确保模式位于一行的开头,可使用如下代码:
^myPattern
这将与一行开头的myPattern匹配。
要在一行的结尾匹配该模式,可使用如下代码:myPattern$
单词分界字符\b和\B容易引起混淆,因为它们不匹配字符,而是匹配字符之间的位置。
- 任何单词字符(即字母,数字或下划线字符)之间的位置以及与任何非单词字符都是单词分界。另外注意,字符串的开始或结束位置与单词字符之间的边界也是单词分界。
- 任何字母,数字或下划线与另一个字母,数字或下划线之间的位置都是非单词分界。另外,两个非单词字符之间的位置,如感叹号和逗号之间的位置,也是一个非单词分界。
例如如下一个示例: -
<script> var myRegExp1=/\b/g; var myRegExp2=/\B/g var myString="Hello world!,let's look at boundaries said 007."; document.write(myString+"<br/>"); document.write("\\b匹配单词分界位置<br/>"); document.write(myString.replace(myRegExp1,"|")+"<br/>"); document.write("\\B匹配非单词分界位置<br/>"); document.write(myString.replace(myRegExp2,"|")); </script>
该示例的输出为:
Hello world!,let’s look at boundaries said 007.
\b匹配单词分界位置
|Hello| |world|!,|let|’|s| |look| |at| |boundaries| |said| |007|.
\B匹配非单词分界位置
H|e|l|l|o w|o|r|l|d!|,l|e|t’s l|o|o|k a|t b|o|u|n|d|a|r|i|e|s s|a|i|d 0|0|7.|正则表达式的分组
如果要把多个表达式处理为一个组,只需要将它们放在圆括号中,如/(\d\d)/。正则表达式中的圆括号是把字符模式组合在一起的特殊字符,圆括号本身不是要匹配的字符。
为什么要对正则表达式分组?将字符组合到模式中后,可以对整个字符组应用重复字符,而不是对单个字符应用重复字符。
例如定义一个字符串”JavaScript,VBScript and PHP”,如何使用同一个正则表达式匹配JavaScript和VBScript?一个简单的办法是使用圆括号组合模式Java和VB,然后对每一个字符组应用特殊字符?,使模式匹配Java或VB子字符串出现0次或1次,且以Script子字符串结尾的单词。var myRegExp=/\b(VB)?(Java)?Script\b/gi;
一种改进的完整代码,使用|或关键字来优化代码:
<script> var myString="JavaScript,VBScript and PHP"; var myRegExp=/\b(VB|Java)?Script\b/gi; myString=myString.replace(myRegExp,"xxxx"); document.write(myString); </script>
重用字符组
可以在正则表达式中重用通过一组字符指定的模式。要引用前面的字符组,只需要输入\和表示分组顺序的数字即可。例如,第1个分组可引用为\1,第2个分组可引用为\2,依次类推。
例如定义一个字符串”007,007,001,002,002,002,003,002,004”,替换掉连续出现3个数字的字符串,如下代码所示:
<script> var myString="007,007,001,002,002,002,003,002,004"; var myRegExp=/(\d+),\1,\1/g; myString=myString.replace(myRegExp,"Error"); document.write(myString); </script>
上面代码的结果为:
007,007,001,Error,003,002,004上面的代码/(\d+),\1,\1/g匹配了一个数字系列,这定义了一个分组,其字符模式是一个或多个数字字符。将一个数字放在一个字符组中,然后可以指定再次匹配这个数字,为此使用\1,它表示:匹配使用圆括号定义的第一组中的字符。
String对象replace方法中匹配分组
String对象中replace()方法的独特之处在于它可以根据与正则表达式匹配的分组来替换文本。为此,要使用 $ 符号和分组的序号。正则表达式中的每个分组都给定了一个1~99之间的数字,大于99的分组是不可以访问的。要引用一个分组,可以使用$符号,后跟分组的序号。例如,对于下面的代码:
var myRegExp=/(\d)(\W)/g;
$1引用分组(\d),$2引用分组(\W)。
例如有字符串”2012,2013,2014”,如果想通过正则表达式把它改为”the year 2012,the year 2013,the year 2014”。首先,需要写出作为正则表达式的模式,在本例中就是4个数字,即:
var myRegExp=/\d{4}/g;
但是每一次匹配的年份都是不同的,如何把对应的年分值放在替换字符串中呢?这时就需要使用分组了,修改正则表达式,把它放在一个分组中,如下所示:
var myRegExp=/(\d{4})/g;
然后就可以在替换字符串中使用序号为1的分组了:
var myString="2012,2013,2014"; var myRegExp=/(\d{4})/g; myString=myString.replace(myRegExp,"the year $1"); document.write(myString+"<br/><br/><br/>");
上面代码的输出结果为:
the year 2012,the year 2013,the year 2014