RegExp对象:(正则表达式)

  使用正则表达式可以快速的筛选和查找到符合要求的字符串子串,效率高,功能强大,而且可以作为参数传递给String对象的一些方法。  

首先来了解如何创建正则表达式

创建方法:

1.var myRegExp = new RegExp("...");
2.var myRegExp =/.../;

RegExp对象的属性:

  G:全局匹配,不只是匹配到第一个就停下来  I:不区分大小写  M:多行标志

  test()方法:检查所传入的参数字符串,确定正则表达式语法指定的字符是否与字符串中的内容相匹配,如果匹配则返回true,否则返回false

特殊字符:
  文本,数字和标点符号

    \d(0~9的任何数字) \D(任何非数字字符) \w(任何单词字符a~z,A~Z,0~9及下划线)  \W(任何非单词字符)  \s(任何空白字符)  \S(任何非空白字符)

    .(除换行符外的任意单个字符)  [...](匹配位于方括号内的任何一个字符)  [^...](匹配除方括号内的字符外的任何字符)

// 检验输入的字符是否符合只有字母,数字和空格
    var input = prompt("please enter a password :")
    function isvalid(text){
        var myRegExp = /[^a-z\d ]/i
        return !(myRegExp.test(text))    
    }

    if(isvalid(input)){
        document.write("your password contants only valid characters")
    }else{
        document.write("your password contants one or more invalid characters")
    }

 重复字符:

  1.{n}前一项出现n次  2.{n,}前一项出现n次及以上  3.{n,m}前一项最少为n次,最多为m次  

  4.? 0或1次  5.+  1或多次  6.*  0或多次

位置字符:

  1.^  模式必须位于字符串的开头,如果是多行,模式位于一行的开头

  2.$ 模式必须Wie与字符串的结束位置,如果是多行,模式位于一行的结尾

  3.\b  匹配单词分界位置

  4.\B 匹配非单词分界位置

// 匹配单词分界位置
        var string = "hello you are my baby!"
        var myRegExp = /\b/g
        string = string.replace(myRegExp,"|")
        document.write(string)
// 将paul替换成Ringo
    var myString = "paul, paula, pauline, Paul, Paul";
    document.write(myString+"<br>")
    var myRegExp = /\bpaul\b/g;
    myString = myString.replace(myRegExp,"Ringo")
    document.write(myString)

正则表达式的分组:
  为什么要对正则表达式分组?原因很简单,将字符组合到模式中后,可以对整个字符组应用重复字符,而不是对单个字符应用重复字符。

  例如:

// 匹配字符组
        var string = "JavaScript,VbScript and PHP,JavaVBScript"
        var myRegExp=/\b(Java)?(Vb)?(Script)\b/g
        str = string.replace(myRegExp,"替换")
        document.write(str)
  但是这样子匹配有一个弊端,如果字符串里面出现了单词为JavaVBScript的话也会被匹配到,可以改进为:
  
     var string = "JavaScript,VbScript and PHP,JavaVbScript"
     var myRegExp=/\b(Java|Vb)?(Script)\b/g
     str = string.replace(myRegExp,"替换")
     document.write(str)
  分组里面提供了或运算符"|"

 重用字符组:  

  在正则表达式中重用通过一组字符指定的模式,要引用前面的字符组,只需要输入“ \ ”和表示分组顺序的数值即可。

// 处理重复出现的字符
        var string = "007,007,002,003,003,005"
        var myRegExp = /(\d+),\1/g
        var str = string.replace(myRegExp,"error")
        document.write(string+"<br>")
        document.write(str)

String对象提供的split(),replace(),match()和search()方法都支持传入RegExp对象作为参数。

例子:

  1.使用split()

//区分出水果
        var string = "apple,0.99,banana,0.50,peach,0.25,orange,0.75"
        var myRegExp = /\b[^a-z]+\b/gi
        var strArr = string.split(myRegExp)
        var show = strArr.join("<br>")
        document.write(show)

  2.引用分组,使用符号 “ $ ”

// 引用分组
        var string = "2012,2013,2014"
        var myRegExp = /(\d{4})/g
        var str = string.replace(myRegExp,"the year $1")
        document.write(str)

  3.使用replace()

var text = "He then said 'My Name is O'Connerly, yes!that's right,O'Connerly'",
            myRegExp = /\B'|'\B/g,
            result = text.replace(myRegExp,"\"")
        document.write(result)
//不要忘了'是一个非单词字符,因此分界将位于它与另一个非单词字符之间

  4.使用search()  (返回找到匹配的位置)

    对于search()方法,全局匹配标记g与此无关

  5.使用match()  (返回一个数组,该数组的每个元素包含一个匹配的文本)

var string = "the years were 2012,2013,2014",
            myRegExp = /\b\d{4}\b/g,
            array = string.match(myRegExp)
        for(i in array)
            document.write(array[i]+"<br>")

  6.拆分HTML

document.write("<div id='output'></div>")
        var html = "<h2>Hello World!</h2><p>We love JavaScript!</p>",
            myRegExp = /<[^>\r\n]+>|[^<>\r\n]+/g,
            arr = html.match(myRegExp)
            document.getElementById("output").innerText = arr.join("\r\n") 

 使用RegExp对象的构造函数:

var myRegExp = new RegExp("\\d+","g"),
            str = "你好007,我是010",
            result = str.match(myRegExp)
            for(i in result)
                document.write(result[i]+"<br>")
//需要使用转义字符“\”,第二个参数为对象属性

 验证电话号码:

// 验证电话号码
        var myRegExp = /^(\+\d{1,3} ?)?(\(\d{1,5}\)|\d{1,5}) ?\d{3} ?\d{0,7}((x|xtn|ext|extn|extension)?\.? ?\d{2,5})?$/  正则表达式在代码中必须占一行
拆解:

    1.(\+\d{1,3} ?)?  国际号码

    2.(\(\d{1,5}\)|\d{1,5})  本地区号

    3. ?\d{3} ?\d{0,7}  实际的用户号码(这里最前面可以有一个空格)

    4.((x|xtn|ext|extn|extension)?\.? ?\d{2,5})?  分机号码(.表示除换行符之外的任意单个字符)

    5./^$/  ^字符指定模式必须从字符串的开头处匹配,$字符表示模式必须匹配到字符串的结尾。这说明字符串必须与模式完全匹配。

 验证域名:

//验证域名
    ^(([a-z]#\d+?)([a-z0-9-]|#\d+?)*([a-z0-9]|#\d+?)\.)+([a-z]{2,4})$

{}里面使用的是逗号,而[]里面使用的是分号-

贪婪匹配和懒惰匹配:

  由于Regex引擎是贪婪的,它会尽可能的匹配多的选项,直到匹配完。有时,我们更需要懒惰匹配,也就是匹配尽可能少的字符。前面给出的限定符都可以被转化为懒惰匹配模式,只要在它后面加上一个问号?,匹配到第一个马上返回,不再继续进行查找。

  正则表达式,表示字符串重复个数元字符,'?,+,*,{}' 默认都会选择贪婪模式,会最大长度匹配字符串,而要切换到懒惰模式,就只是在该元字符,后面加多一个”?” 即可切换到非贪婪模式(懒惰模式)。

最后,一个例题:

  下面的代码解决了什么问题?

 

var string = "this sentence has has a fault and and we need to fix it.",
            myRegExp = /(\b\w+\b) \1/g,
            myString = string.replace(myRegExp,"$1")
        document.write(myString)

 

答案很简单,解决了单词重复的问题

Posted on 2020-06-27 13:03  Schrodinger'sdoris  阅读(259)  评论(0编辑  收藏  举报