日期:2014-05-16  浏览次数:20406 次

JS正则表达式的方法【转】

JS正则表达式的方法

?

JS中正则表达式有几种不同的使用方法,一些用法是通过字符串对象来使用,另外一些通过正则表达式对象使用。

一、RegExp(正则表达式)的属性和方法
1、属性
RegExp的实例有几个只读的属性:
global表示是否为全局匹配,
igoreCase表示是否忽略大小写,
multiline表示是否为多行匹配,
source是正则式的源文本,如/[ab]/g的源文本就是[ab];
另外还有一个可写的属性是lastIndex,表示下次执行匹配时的起始位置。
2、方法
RegExp有两个方法exec和test,均以待匹配的字符串为参数。
(1)exec
如果没有发现匹配则返回null,否则返回一个数组,该数组的第一项为匹配的字符串,接下去为与各个子表达式相匹配的子串;该数组的属性index表示发生匹配的位置,属性input表示被检索的字符串。
注意:如果正则式具有全局属性g,则执行一次exec后,该RegExp对象的lastIndex属性会被设为紧接着匹配子串的字符位置,当该 RegExp对象再次调用exec时就会从lastIndex处开始执行匹配。如果exec没有发现任何匹配,它会将lastIndex设为0。当然,如 果没有全局属性g的话,exec总是会将lastIndex设为0。
例如:
re = /[ab]+(c)+/g;
m = re.exec('acabcc');
// m[0]为'a', m[1]为'c', m.index为0,m.input为'acabcc',re.lastIndex为2
m = re.exec('acabcc');
// m[0]为'ab', m[1]为'cc', m.index为2,m.input为'acabcc',re.lastIndex为6
m = re.exec('acabcc');
// m为null,re.lastIndex为0
(2)test
test方法执行一次exec,如果发生匹配返回true,否则返回false。
因为test方法是调用exec的,所以也可以用test方法来遍历一个字符串。

二、和正则式相关的几个String(字符串)的方法
1、search(RegExp)
返回第一个与之匹配的子串的开始位置,如果没有匹配则返回-1。
传入的参数如果不是正则式则会传递给RegExp构造函数先转成正则式再进行匹配.
不支持全局匹配g
2、replace(RegExp, replacement)
第一个参数是正则式,第二个参数是要进行替换的字符串。
如果正则式指定了全局模式g,则会替换所有的匹配,否则只替换第一个匹配。replacement中的$符号具有特殊含义,$1,$2,...,$99 代表与正则式中的第1个到第99个子表达式相匹配的文本,$& 代表与正则式相匹配的文本,$` 代表位于匹配字串左侧的文本,$' 代表位于匹配字串右侧的文本,$$ 为直接量$
例如,想用花引号代替直引号,可用如下代码:
text.replace(/"([^"])*"/g, "``$1''")
另外,replacement也可是函数,传入的参数就是匹配的文本,返回替换的文本即可。
例如,将文本中每个单词的首字母改为大写字母:
text.replace(/\b\w+\b/g, function(word){return word.substr(0,1).toUpperCase()+word.substr(1);})
3、match(RegExp)
无匹配时返回null, 否则返回一个数组,该数组的内容取决于正则式是否具备全局属性g。如果没有全局属性g,则match的返回值和exec的返回值类似。如果具有全局属性g,则返回数组代表的是所有匹配的文本,而不含有任何子表达式匹配的信息,也没有index和input属性
4、split(delimiter, limit)
返回一个字符串数组,这些数组元素是通过从头到尾检索字符串中与delimiter相匹配的文本,在文本之前和之后分割原string得到,返回的子串中 不包括定界符文本(注:当delimiter是包含子表达式的正则式时,返回数组中将包含与子表达式相匹配的文本,但是不包含与整个正则式相匹配的文 本)。如果定界符与字符串的开头相匹配,则返回数组的第一个元素是空串;如果定界符与字符串结尾相匹配,则数组的最后一个元素是空串(注:如果 delimiter是空串或与空串相匹配的正则式,那么字符串的每个字符之间都被分割,返回数组长度与原字符串长度一致,因为空串不匹配字符串的开头或结 尾!
例如:"Hello<b>world</b>".split(/(<[^>]*>)/)
返回 ['Hello ', '<b>', 'world', '</b>', ''])。


示例:
<%@ page language="java" contentType="text/html; charset=UTF-8"

?
?? pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JS正则表达式的使用</title>
?<script type="text/javascript">
?? function test(){
???? var reCat = /cat/i;
???? var sMatch = "a Cat B CAT D Cat F Cat";
???? alert(reCat.test(sMatch));
?? }
?? function exec(){
???? var reAt = /at/;
???? var sMatch = "a bat a cat a fat a dat";
???? var arrMatches = reAt.exec(sMatch);
???? alert(arrMatches[0]);
???? alert(arrMatches.length);
?? }
?? function match(){
???? var reAt = /at/gi;
???? var sMatch = "a bat a cat a fat a dat";
???? var arrMatches = sMatch.match(reAt);
???? alert(arrMatches[0]);
???? alert(arrMatches.length);
?? }
?? function search(){
???? var reAt = /at/gi;
???? var sMatch = "a bat a cat a fat a dat";
???? alert(sMatch.search(reAt));
?? }
??? function replace(){
???? var reAt = /blue/gi;
???? var sMatch = "The sky is blue";
???? alert(sMatch.replace(reAt,"red"));
?? }
??? function split(){
???? var reComma = /\,/;
???? var sMatch = "red , blue , yellow , green";
???? var arrColors = sMatch.split(reComma);
???? for(var i=0;i<arrColors.length;i++){
?????? alert(arrColors[i]);
???? }
?? }
?</script><