Posted on 2006-08-20 21:17
【青峰小寨】 阅读(278)
评论(0) 编辑 收藏 引用 所属分类:
Java小记
这段时间项目上都流行起AJAX,而JavaScript就成为了AJAX的核心部分。以前只是用JavaScript实现一下页面的特效而已,而现在使用起来发现它的功能而不小。好了,还是讲今天的正题吧,关于AJAX我肯定会单独发时间和发篇幅来描述它的。
在前面我已经讲述了关于正则表达式的概念和基本语法,现在就研究一下正则表达式在JavaScript中应用。
使用RegExp对象执行字符串模式匹配
RegExp是JavaScript中的正则表达式对象,利用它可以完成字符串匹配的各种操作。获得一个RegExp对象可以用两种方式:
var objRegExp = /pattern*/[flag]
//或者
var objRegExp = newRegExp("pattern" [, "flag"]);
其中pattern是要匹配的模式,flag表示搜索模式,有两个可选参数,分别是g和i。g表示全局搜索,在后面介绍的replace方法中非常有用;i表示忽略大小写,默认情况下是大小写敏感的。
例如:
/jimek/ig
new RegExp("jimek","ig");
都表示全局匹配文本中的"jimek"单词,并且忽略大小写。
① RegExp的方法(如下表)
表
正则表达式对象
RegExp
的方法
|
方 法
|
描 述
|
compile(pattern,flags)
|
将正则表达式转换为内部格式,对于批量匹配可以提高匹配效率
|
exec(str)
|
按照RegExp对象的匹配模式对str字符串进行匹配查找,当设定了全局搜索模式(g),则匹配查找从RegExp对象lastIndex属性指定的目标字符串位置开始;若没有设置全局搜索,则从目标字符串第一个字符开始搜索。若没有任何匹配发生,返回null。
该方法将匹配结果放在一个数组内返回,该数组由3个属性:
input
:包含目标字符串,同RegExp.index
index
:匹配到的子字符串在目标子字符串中的位置,同RegExp.index
lastIndex
:匹配到的子字符串后面一个字符的位置,同RegExp.lastIndex
|
test(str)
|
判断str是否符合指定的模式,返回一个布尔变量,true或者false,需要注意,这个方法不会改变RegExp的属性值
|
在执行完字符串匹配后,匹配结果会以RegExp静态属性的方式提供给脚本程序,每次执行exec都会改变这些静态属性。
② RegExp的静态属性
表 正则表达式对象RegExp的静态属性 |
静 态 属 性 | 描 述 |
RegExp.input | 保存被搜索的字符串 |
RegExp.index | 保存匹配的首字符的位置 |
RegExp.lastIndex | 保存匹配的字符串下一个字符的位置 |
RegExp.lastMatch | 保存匹配到的字符串 |
RegExp.lastParen | 保存最后一个被匹配的字符串(最后一个括号的内容) |
RegExp.leftContext | 保存匹配字符串左边的内容 |
RegExp.rightContext | 保存匹配字符串右边的内容 |
RegExp.$1~$9 | 保存最开始的9个子匹配(括号中的内容) |
由此可见,所有的匹配结果都保存在同一个位置,当执行exec方法后,这些静态属性就会改变。因此,必须确保在执行完匹配后立即去使用匹配结果,或将它们保存到另外的变量中,而不再使用RegExp的这些属性。
提取子字符串
在匹配模式中,可以用小括号将子模式括起来,以获取子匹配的内容,这些匹配的结果被存储在RegExp.$1
~$9中。例如,对于xml片断:
<author>jimek</author>
如果要使用正则表达式获取其中的作者:jimek,可以这样实现:
<script language="JavaScript" type="text/javascript">
<!--
var strXml = "<author>jimek</author>";
var regExp = /<author>(\w*)</author>/;
regExp.exec(strXml);
var author = RegExp.$1;
alert(author);
//-->
</script>
当需要提取多个子模式时,可以使用RegExp.$1~$9依次获取得到的字符串。如果需要得到的子模式不只9个,也可以使用exec返回的数组来获取子字符串,返回数组的长度为子模式的个数加1,其中数组索引为0的元素表示被搜索的字符串,其后的元素依次对应于模式中的括号。例如上面的例子也可以用下面的代码实现:
<script language="JavaScript" type="text/javascript">
<!--
var strXml = "<author>jimek</author>";
var regExp = /<author>(\w*)</author>/;
var arr = regExp.exec(strXml);
var author = arr[1];
alert(author);
//-->
</script>
与字符串相关的操作
在字符串相关的操作时,有3个方法的参数需要用到正则表达式:
1. string.search(regularExpression)
其中string是要处理的字符串,regularExpression是匹配模式。该方法在string中查找指定的模式,如果找到,则返回它的第一个字符的索引位置,否则返回-1。例如:
"<author>jimek</author>".search(/jimek/);
显示结果为8。与indexOf()方法不同,该方法接收的是一个正则表达式,而indexOf只能接收一个字符串。但两者的行为是类似的。
2. string.replace(regularExpression,replaceString)
其中regularExpression是要查找的模式,replaceString是要替换匹配模式的字符串。regularExpression也可以用普通字符串,但那样只能替换第一个出现的匹配,之后的匹配则被忽略。使用正则表达式后可以使用全局模式来实现整个替换。替换后原有字符串不发生变化,而是返回一个新的字符串。
例如:在实际开发中经常要删除一段文本中HTML标记,以获取纯文本,可以使用如下代码实现:
<script language="JavaScript" type="text/javascript">
<!--
function stripTags(s){
return s.replace(/<\/?[^>]+>/ig, '');
}
var str = stripTags("<author>jimek</author>");
alert(str);
//-->
</script>
这样,HTML标记后的文本又得到了“jimek”。
3. string.match(regularExpression)
该方法根据regularExpression正则表达式模式查找字符串string中的匹配字符项,将结果以数组形式返回。该数组有3个属性值,与exec方法返回的数组属性相同。若没有任何匹配,返回null。
注意:若regularExpression对象未设定全局匹配模式,则数组索引为0的元素就是匹配的整体内容,索引为1~9的元素则包含了子匹配得到的字符。若设定了全局模式,则数组包含了搜索到的所有整体匹配项。