JavaScript String详解

深入理解JavaScript正则表达式
本文详细介绍了JavaScript中正则表达式的使用方法,包括基本属性、方法、创建方式及特性,以及如何在字符串中应用正则表达式进行匹配、搜索、替换等操作。

在另一篇里学习了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");

  


转载于:https://www.cnblogs.com/hyhbg/archive/2012/03/28/2419881.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值