正则表达式

Posted hzyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。

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-zd ]/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.  匹配单词分界位置

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

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

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

  例如:

// 匹配字符组
        var string = "javascript,VbScript and php,JavaVBScript"
        var myRegExp=/(Java)?(Vb)?(Script)/g
        str = string.replace(myRegExp,"替换")
        document.write(str)
  但是这样子匹配有一个弊端,如果字符串里面出现了单词为JavaVBScript的话也会被匹配到,可以改进为:
  
     var string = "JavaScript,VbScript and PHP,JavaVbScript"
     var myRegExp=/(Java|Vb)?(Script)/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 = /[^a-z]+/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 = /d{4}/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 = /<[^>
]+>|[^<>
]+/g,
            arr = html.match(myRegExp)
            document.getElementById("output").innerText = arr.join("
") 

 使用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 = /(w+) 1/g,
            myString = string.replace(myRegExp,"$1")
        document.write(myString)

 

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

以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串

攻破难啃的骨头-正则表达式(转)

正则表达式的贪婪和非贪婪模式