现在的位置: 首页 > 综合 > 正文

JavaScript 正则表达式(RegExp对象、属性、方法、String支持)

2012年08月02日 ⁄ 综合 ⁄ 共 4556字 ⁄ 字号 评论关闭

内容来源:JavaScript RegExp 对象参考手册    http://www.w3school.com.cn/js/jsref_obj_regexp.asp

 

RegExp 对象

RegExp 对象属性

RegExp 对象方法

支持正则表达式的 String 对象的方法

 

 

RegExp 对象

RegExp 对象表示正则表达式,它是对字符串执行模式匹配的强大工具。

直接量语法: /pattern/attributes

创建 RegExp 对象的语法:new RegExp(pattern, attributes);

参数
参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。

参数 attributes 是一个可选的字符串,包含属性 "g"、"i" 和 "m",分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。

 

返回值
一个新的 RegExp 对象,具有指定的模式和标志。如果参数 pattern 是正则表达式而不是字符串,那么 RegExp() 构造函数将用与指定的 RegExp 相同的模式和标志创建一个新的 RegExp 对象。

如果不用 new 运算符,而将 RegExp() 作为函数调用,那么它的行为与用 new 运算符调用时一样,只是当 pattern 是正则表达式时,它只返回 pattern,而不再创建一个新的 RegExp 对象。

 

抛出
SyntaxError - 如果 pattern 不是合法的正则表达式,或 attributes 含有 "g"、"i" 和 "m" 之外的字符,抛出该异常。

TypeError - 如果 pattern 是 RegExp 对象,但没有省略 attributes 参数,抛出该异常。


 

RegExp 对象属性

global           RegExp 对象是否具有标志 g。

ignoreCase    RegExp 对象是否具有标志 i。

lastIndex       一个整数,标示开始下一次匹配的字符位置。

multiline         RegExp 对象是否具有标志 m。

source           正则表达式的源文本。


 

RegExp 对象方法

compile    编译正则表达式,也可用于改变和重新编译正则表达式。

exec        检索字符串中指定的值。返回找到的值,并确定其位置。

exec() 方法的功能非常强大,它是一个通用的方法,而且使用起来也比 test() 方法以及支持正则表达式的 String 对象的方法更为复杂。

1、在循环中反复地调用 exec() 方法是唯一一种获得全局模式的完整模式匹配信息的方法。

<script type="text/javascript">

var str = "Visit W3School"; 
var patt = new RegExp("W3School","g");
var result;

while ((result = patt.exec(str)) != null)  {
  document.write(result);
  document.write("<br />");
  document.write(result.lastIndex);
 }
</script>

/*
输出:

W3School
14
*/

2、如果 exec() 找到了匹配的文本,则返回一个结果数组。否则,返回 null。

此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式(圆括号引用正则表达式的某部分)相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。

除了数组元素和 length 属性之外,exec() 方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。

var re = /(ds)+(j+s)/ig;
var str = "cfdsJS *(&dsjjjsYJSjs 888dsdsJS";
var resultArray = re.exec(str);
while (resultArray) {
    document.writeln(resultArray[0]);
    document.writeln("next match starts at " + re.lastIndex + "<br />");
    for (var i=1; i<resultArray.length; i++)
    {
        document.writeln("substring of " + resultArray[i] + "<br />");
    }
    document.writeln("<br />")
    
    resultArray = re.exec(str);
}

/*
输出:
dsJS next match starts at 6
substring of ds
substring of JS

dsjjjs next match starts at 16
substring of ds
substring of jjjs

dsdsJS next match starts at 31
substring of ds
substring of JS
*/

test         检索字符串中指定的值。如果含有指定的值返回 true ,否则返回 false。

调用 RegExp 对象 r 的 test() 方法,并为它传递字符串 s,与这个表示式是等价的:(r.exec(s) != null)。

<script type="text/javascript">
var str = "Visit W3School";
var patt1 = new RegExp("W3School");

var result = patt1.test(str);

document.write("Result: " + result);
</script>
/*
输出:

Result: true
*/

 

支持正则表达式的 String 对象的方法

search    检索与正则表达式相匹配的值。

如果没有找到任何匹配的子串,则返回 -1。

要执行忽略大小写的检索,请追加标志 i。

search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。

<script type="text/javascript">

var str="Visit W3School!"
document.write(str.search(/w3school/i))

</script>
/*
输出:

6
*/

match    找到一个或多个正则表达式的匹配。

该方法类似 indexOf() 和 lastIndexOf(),但是它返回指定的值,而不是字符串的位置。

全局模式下建议使用 RegExp.exec() 代替本方法。

replace   替换与正则表达式匹配的子串。

stringObject.replace(regexp/substr,replacement

字符串 stringObject 的 replace() 方法执行的是查找并替换的操作。它将在 stringObject 中查找与 regexp 相匹配的子字符串,然后用 replacement 来替换这些子串。如果 regexp 具有全局标志 g,那么 replace() 方法将替换所有匹配的子串。否则,它只替换第一个匹配子串。

replacement 可以是字符串,也可以是函数。如果它是字符串,那么每个匹配都将由字符串替换。但是 replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换。

字符                          替换文本
$1、$2、...、$99       与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
$&                             与 regexp 相匹配的子串。
$`                             位于匹配子串左侧的文本。
$'                              位于匹配子串右侧的文本。
$$                             直接量符号。

注意:ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。

// 1、执行一次全局替换,每当 "Microsoft" 被找到,它就被替换为 "W3School":
<script type="text/javascript">

var str="Welcome to Microsoft! "
str=str + "We are proud to announce that Microsoft has "
str=str + "one of the largest Web Developers sites in the world."

document.write(str.replace(/Microsoft/g, "W3School"))

</script>
/*
输出:

Welcome to W3School! We are proud to announce that W3School
has one of the largest Web Developers sites in the world.例子 3
*/


//2、确保匹配字符串大写字符的正确:
text = "javascript Tutorial";
text.replace(/javascript/i, "JavaScript");


//3、将把 "Doe, John" 转换为 "John Doe" 的形式:
name = "Doe, John";
name.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1");


//4、把所有的花引号替换为直引号:
name = '"a", "b"';
name.replace(/"([^"]*)"/g, "'$1'");


//5、把字符串中所有单词的首字母都转换为大写:
name = 'aaa bbb ccc';
uw=name.replace(/\b\w+\b/g, function(word){
  return word.substring(0,1).toUpperCase()+word.substring(1);}
  );

split       把字符串分割为字符串数组。

stringObject.split(separator,howmany)

howmany:可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。

注释:如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。

注释:String.split() 执行的操作与 Array.join 执行的操作是相反的。

 

 

推荐文章:

MSDN JScript 8.0 正则表达式介绍  http://msdn.microsoft.com/zh-cn/library/28hw3sce

抱歉!评论已关闭.