zoukankan      html  css  js  c++  java
  • 正则表达式对象和RegExp对象

    正则表达式对象和RegExp对象

    正则表达式对象保存用于查找字符串中的字符组合时的模式。创建正则表达式对象后,或者它被传递给字符串方法,或者字符串被传递给一个正则表达式方法。有关最近进行查找的信息被保存在 RegExp 对象中。

    创建正则表达式对象有两种方法。如果预先知道要查找的字符串时,用语法1:

    var regularexpression = /pattern/[switch]

    当查找字符串经常变动或不知道时用语法2:

        var regularexpression = new RegExp("pattern",["switch"])

    pattern是要查找的字符串,在语法1中用斜杠括起来,而在语法2中有引号。switch是开关,有三种选择,"i" 表示忽略大小写"g" 表示全文查找出现的所有pattern,"gi" 表示两者都要,即全文查找并忽略大小写

    执行查找

    创建了正则表达式对象后,要执行查找用exec方法,语法:

        rgexp.exec(str)

    rgexp是正则表达式对象,可以是变量名或文字。str是被查找的字符串。例如,

    var s = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPp";
    var r = new RegExp("g", "i"); 
    var a = r.exec(s);
    document.write(a);   //显示G

    因为忽略大小写,执行搜索后第一个匹配的是G,所以变量a="G"。

    exec方法查找的结果被放在一个数组中。如果 exec 方法没有找到匹配,则它返回 null。如果它找到一个或多个匹配,则exec 方法返回一个数组,并且更新 RegExp 对象,来反映查找结果。在RegExp 对象的属性 $1, ...$9 中保存最近的九个结果。无论何时产生一个成功的带插入语的匹配,$1...$9 属性的值都被修改,但是只有最近的九个可以被保存起来。

    测试正则表达式模式

    可以用test方法来测试正则表达式在被查字符串的中是否存在。语法

        rgexp.test(str)

    语法与exec方法一样。它返回一个Boolean值,如果存在就返回true,否则返回false。test 方法不修改RegExp对象中的信息。

    RegExp对象和它的属性

    RegExp对象用于保存对正则表达式模式查找的信息,这些信息保持在它的属性中。RegExp对象没有方法。一般语法是

        RegExp.propertyname

    propertyname 参数是RegExp对象的一个属性。RegExp对象有下列属性:

    $1-$9 属性       返回九个在模式匹配期间找到的、最近保存的部分。只读。
    RegExp.index  返回第一个成功匹配的字符串的开始位置。
    RegExp.lastIndex  返回字符位置,它是被查找字符串中最后一次成功匹配的开始位置。
    RegExp.input 
    返回执行查找的字符串。只读。

    lastIndex 属性是基于零的,也就是说,第一个字符的索引是零。不论何时产生一个成功匹配,它的值都被修改。lastIndex 属性被RegExp 对象的exec 和test 方法,以及String 对象的match、replace、和 split 方法修改。

    下面的规则应用于 lastIndex 的值:

    • 如果还没有匹配,则 lastIndex 被设置为 -1.
    • 如果 lastIndex 比字符串的长度大,则 test 和 exec 失败,并且 lastIndex 被设置为 -1。
    • 如果 lastIndex 等于字符串的长度,且模式与空字符串匹配,则正则表达式匹配。否则,匹配失败并且 lastIndex 被重置为 -1。
    • 否则,lastIndex 被设置为紧接最近的匹配的下一个位置。

    例程1 下面的代码用来考察上述属性的内容。

    function RegexpDemo(reg, str){
    var re = new RegExp(reg ,"gi"); 
    var a = re.exec(str);
    var BR = "<br>";
    if (re.test(str))
    document.write ("找到的第一个匹配的字符串是" +a + BR);
    document.write ("第一个匹配位置是" +RegExp.index+ BR);
    document.write ("最后一个匹配位置是" +RegExp.lastIndex+ BR);
    document.write ("被查找的文本是:" +BR +RegExp.input+ BR);
    document.write ("$1=" + RegExp.$1);
    };
    var str = "The built-in objects are special because they are built into ASP pages and do not need to be created before you can use them in scripts.";
    var reg = "(OBJECT)";
    document.write ("查找" + reg + "<br>");
    RegexpDemo(reg, str+str);

    运行例程

    说明 查找的字符串OBJECT加括号,$1有值。如果不加括号,$1是空串。什么道理? 我也不知道。


    正则表达式对象的属性

    正则表达式对象有两个属性属性。lastIndex属性指定索引,下一个匹配从该索引处开始。语法:

        rgexp.lastIndex [= index]

    请参照RegExp对象的lastIndex属性。

    source属性返回正则表达式模式的文本的复本,只读。语法:

        rgexp.source

    下面的例子说明了source 属性的用法:

    function SourceDemo(re, s)
    {
    var s1;
    // 测试字符串中是否存在正则表达式。
    if (re.test(s))
    s1 = " contains ";
    else
    s1 = " does not contain ";
    // 获得正则表达式自己的文本。
    return(s + s1 + re.source);

    RegExp.input  是返回被查找的字符串,而source是返回要查找的字符串。

    正则表达式对象的compile方法

    正则表达式模式pattern 参数在使用前被编译为内部格式。对语法1 来说,pattern 在该脚本装载时被编译。对语法2 来说,pattern 在使用前,或调用compile方法时被编译。compile方法把pattern转换为内部格式,从而执行得更快。这使得在循环中可更有效地使用正则表达式。语法如下:

        rgexp.compile(pattern)

    下面的例子说明了compile 方法的用法:

    function CompileDemo()
    {
    var s = "AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPp"
    // 只为大写字母创建正则表达式。
    var r = new RegExp("[A-Z]", "g");
    var a = s.match(r)	// 查找匹配。
      document.write(a);
    r.compile("[a-z]", "g");// 只为小写字母编译正则表达式。
    var a = s.match(r)	// 查找匹配。
    document.write(a);
    }

    代码注释

    match是String对象的一个方法,其功能是使用正则表达式对象对字符串进行查找,并将结果作为数组返回。语法:

    stringObj.match(rgExp)
    match 方法与RegExp.exec 方法有些相似,将返回一个数组。该数组的元素0 包含最后匹配的字符,元素 1...n 包含与正则表达式中任何用插入符分开的子字符串匹配的内容。该方法将更新RegExp 对象的内容。

    下面的示例演示了match方法的用法:

    function MatchDemo()
    {
    var r, re;
    var s = "The quick brown fox jumped over the lazy yellow dog.";
    re = /fox/i;
    r = s.match(re);
    return(r);
    }

    VBscript中的正则表达式

    在VBscript中,正则表达式对象就是RegExp对象。RegExp对象有3个属性:

    • Pattern 属性,设置或返回被搜索的正则表达式模式。
    • Global  属性,指明在整个搜索字符串时模式是全部匹配还是只匹配第一个。
    • IgnoreCase 属性,指明模式搜索是否区分大小写。

    RegExp对象有3种方法:

    • object.Execute(string对指定的字符串执行正则表达式搜索。Execute方法返回一个 Matches 集合,其中包含了在string 中找到的每一个匹配的 Match 对象。如果未找到匹配,Execute 将返回空的 Matches 集合。
    • object.Test(string对指定的字符串执行一次测试性搜索,只返回一个 Boolean值指示是否存在匹配。
    • object.Replace(string1, string2替换在正则表达式中找到的文本。搜索string1,用string2替换。返回string1被替换后的字符串。

    这里object是已定义的正则表达式,string是被搜索的文本。要查找的是用Pattern描述的正则表达式模式。

    例程1 创建一个正则表达式,并演示替换方法。

    Function ReplaceTest(patrn, replStr)
    Dim regEx, str1
    str1 = "The quick brown fox jumped over the lazy dog."
    Set regEx = New RegExp
    regEx.Pattern = patrn
    regEx.IgnoreCase = True
    ReplaceTest = regEx.Replace(str1, replStr)
    End Function
    MsgBox(ReplaceTest("fox", "cat"))
    这个例程请读者自己拷贝下来运行。

    Match对象和Matches集合

    只能通过 RegExp 对象的Execute 方法来创建,该方法实际上返回了Match 对象的集合Matches。所有的Match 对象属性都是只读的。每个Match 对象提供了被正则表达式搜索找到的匹配字符串的开始位置、长度,字符串本身等信息,通过Match对象的属性供用户访问

    • FirstIndex  在搜索字符串中匹配的位置。
    • Length 匹配字符串的长度。
    • Value  找到的匹配字符串。

    例程2 创建一个正则表达式,执行搜索,并显示每一个匹配的结果。

    Function RegExpTest(patrn, strng)
      Dim regEx, Match, Matches
      Set regEx = New RegExp
      regEx.Pattern = patrn
      regEx.IgnoreCase = True
      regEx.Global = True
      Set Matches = regEx.Execute(strng)
      For Each Match in Matches
        RetStr = RetStr & "Match " & Match & " found at position "
        RetStr = RetStr & Match.FirstIndex & ". Match Value is "
        RetStr = RetStr & Match.Value & "'." & "<br>"
      Next
      RegExpTest = RetStr
    End Function
    document.write (RegExpTest("is.", "IS1 is2 IS3 is4"))

    运行例程2  

    两种语言正则表达式的用法对照表

    VBscript的RegExp对象 Javascript的正则表达式
    IgnoreCase属性 创建语法中的开关switch ="i"
    Global属性 创建语法中的开关switch ="g"
    Pattern属性 创建语法中的Pattern参数
    matchs对象集合 属性$1 - $9
    Execute方法 exec方法
    Test方法 test方法
    Replace方法 没有对应方法,但有字符串对象的replace方法
    没有对应的方法 compile方法
    没有对应的属性 source属性

    有许多用于正则表达式模式的特殊字符,这在两种语言中是一样的。详情见相关文章。

    文 东方一峰 2002-12-27

    URL:http://www.shps.cn/developweb/webSchool/VBJAVA/VBJjc016.htm
     

  • 相关阅读:
    VC++学习(16):线程同步与异步套接字
    VC++学习(15):多线程
    VC++学习(12):文件操作
    VC++学习(10):绘图控制
    VC++学习(13):文档串行化
    VC++学习(11):图形的保存和重绘
    VC++学习(18):Active控件
    四大数据库的比较(SQL Server、Oracle、Sybase和DB2)
    Gridview中二级联动
    VS 2008中PDA开发环境的相关配置
  • 原文地址:https://www.cnblogs.com/yiki/p/690233.html
Copyright © 2011-2022 走看看