在另一篇里学习了String对象的一些属性和方法,包括:
- length属性:
- charAt():
- charCodeAt():
- indexOf():
- lastIndexOf():
- substr():
- substring():
- toUpperCase():
- toLowerCase():
在这里,我们学习4个新的方法:split()、match()、replace()和search()。虽然这4个方法可以应用于普通字符串,但是,与正则表达式结合会发挥更大的作用。
应用在普通字符串的情况:
- split():根据分隔符将一个字符串拆分成一个由子串组成的数组。分隔符由参数传入。分隔符可以是一个字符,也可以是一个字符串。注意,用逗号拆分"a,b,c,"得到的数组长度是4。
- replace(oldString,newString):如果存在oldString,那么将匹配oldString的子串都替换为newString。这个函数返回一个新的替换后的字符串,调用这个函数的字符串不会改变。
- search():查找特定的子串,返回子串在字符串中第一次出现的位置。如果找不到子串则返回-1。
- match():与search方法类似,不同的是match方法返回一个数组,如果参数是普通的字符串,这个数组只有一个元素,即查找到的第一个匹配元素。这个方法应用在普通字符串上没有多大意义。如果参数是正则表达式,那么数组有多个元素,这些元素都匹配正则表达式。
JavaScript中的正则表达式被封装成RegExp对象。
创建一个RegExp对象可以采用两种方法:一是使用正则表达式的字面值。例如:
1 var myRegExp = /\b'|'\b/;
其中,正斜杠(/)表示正则表达式的开始和结束。第二种方法是使用RegExp对象的构造函数:
var myRegExp = new RegExp("\\b'|'\\b");
第二种方法的好处是可以在运行时创建RegExp。例如根据用户的输入来创建。
RegExp对象的方法:
- test(string):用于测试传入的参数字符串是否与RegExp对象中定义的模式字符串匹配。
默认情况下,RegExp对象仅查找与模式匹配的第一个子串。
正则表达式具有3个特性,我们可以设置相应的特性来实现不同的目的。
- g:表示全局匹配,即查找所有与模式匹配的子串。
- i:表示忽略字母的大小写。
- m:多行标记。仅在IE5.5+和NN6+浏览器中可用。该标记指定了元字符^和$可以匹配多行字符串的开始和结束位置。
例如,下面正则表达式匹配第一个"Paul"子串,
1 var myRegExp = /Paul/;
而下面的正则表达式匹配所有的"Paul",而且不记大小写:
1 var myRegExp = /Paul/gi;
位置元字符:
- ^:匹配字符串的开始位置。如果设置了多行标记m,那么^也匹配多行字符每一行的开始位置。例如正则表达式^A匹配第一个字母是A的字符串。
- $:匹配字符串的结束位置。如果设置了多行标记m,那么$也匹配多行字符串每一行结束的位置。
- \b:匹配单词(字符)的分界位置。单词的分界位置就是单词字符与一个非单词字符之间的位置。例如A,B中,A后面和B前面都是分界位置。字符串的开始和结束位置与单词字符之间的边界也被视为单词字符。
- \B:匹配单词的非分界位置。两个单词字符之间的位置是单词的非分界位置。
可以使用圆括号对正则表达式进行分组。(AB){2}匹配ABAB而不是ABB了。
可以使用正斜杠后面跟数字来引用分组。例如(AB),/1匹配AB,AB;(AB),(CD),/2匹配AB,CD,CD。斜杠后面的数是几就表示引用的是第几个分组。这种方式可用来检测两个连续一样的子串。例如
var str = "abc def def ghi";
var reg = /(\w+) \1/gi;//匹配"def def"
上例中\1引用当前与\w+分组匹配的子串。注意,斜杠后面加数字表示第几个分组的,因此,想要使用这种形式必须要先分组。
这是在正则表达式中引用与分组匹配的字符串。也可以在replace()方法中引用与正则表达式分组匹配的字符串,此时使用$符号后面跟数字(表示第几个分组):
1 var str = "1999,2000,2001";
2 var reg = /(\d{4})/g;
3 var rst = str.replace(reg, "the year $1");//the year 1999,the year 2000,the year 2001
上面$1引用与reg中的第一个分组匹配的字符串。$1与\1的使用方式一样,都是引用与正则表达式第一个分组匹配的字符串,但是使用的地方不同,\1是在正则表达式内部引用,$1是再外部引用。仍然注意,使用\1或者$1的前提是正则表达式进行了分组。
字符串的子串会以最大的长度来匹配正则表达式。如果正则表达式有“|”等运算,字符串按上面规则(匹配最长的子串)优先匹配“|”符号前面的部分。例如:
1 var str = "<1><2><3>";
2 var reg = /<.*>/g;
3 alert(str.match(reg).length);
上面结果数组的长度将是1。虽然<1><2><3>都匹配reg,但是整个字符串也匹配reg,因此最终匹配的将是最长匹配的那个子串。又如:
1 var str = "<1><2><3>";
2 var reg1 = /<.>|<.*>/g;
3 var reg2 = /<.*>|<.>/g;
4 alert(str.match(reg1).length);//3
5 alert(str.match(reg2).lengtg);//1
上面的结果说明,先匹配“|”前面的部分,然后再匹配“|”后面部分。也就是说,如果前后都有匹配项,则优先匹配前面的,即使后面匹配的更长。此时,匹配最长子串的规则分别用在前后部分。
使用new操作符创建正则表达式时,由于"\"是javascript的转义字符,因此元字符"\d"、"\w"等都应该写成"\\d"和"\\w"的形式。
RegExp的构造函数的第二个参数可选的,它接收g、i、m,效果同第一种创建方式一样。例如
1 var reg = new RegExp("\d","gi");