• <td id="ae6ms"><li id="ae6ms"></li></td>
  • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
  • <table id="ae6ms"></table>
  • <td id="ae6ms"></td>
    <td id="ae6ms"></td>
  • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
  • <td id="ae6ms"></td>
  • <table id="ae6ms"><li id="ae6ms"></li></table>
  • <table id="ae6ms"></table>
    西西軟件園多重安全檢測下載網站、值得信賴的軟件下載站!
    軟件
    軟件
    文章
    搜索

    首頁編程開發javascript|JQuery → JavaScript的正則表達式語法、經典 Javascript 正則表達式

    JavaScript的正則表達式語法、經典 Javascript 正則表達式

    相關軟件相關文章發表評論 來源:西西原創時間:2013/12/19 16:51:15字體大?。?em class="fontsize">A-A+

    作者:西西點擊:180次評論:0次標簽: 正則表達式

    • 類型:電子教程大?。?i>9.5M語言:中文 評分:8.0
    • 標簽:
    立即下載

    正則表達式是一個描述字符模式的對象。 
    JavaScript的RegExp對象和String對象定義了使用正則表達式來執行強大的模式匹配和文本檢索與替換函數的方法.

    在JavaScript中,正則表達式是由一個RegExp對象表示的.當然,可以使用一個RegExp()構造函數來創建RegExp對象,也可以用JavaScript 1.2中的新添加的一個特殊語法來創建RegExp對象.就像字符串直接量被定義為包含在引號內的字符一樣,正則表達式直接量也被定義為包含在一對斜杠(/)之間的字符。

    正則表達式用于字符串處理,表單驗證等場合,實用高效,RegExp 對象保存有關正則表達式模式匹配信息的固有全局對象。
    RegExp.property必選項 property 參數是 RegExp 對象的任意一個屬性。
    一個正則表達式就是由普通字符(例如字符 a 到 z)以及特殊字符(稱為元字符)組成的文字模式。該模式描述在查找文字主體時待匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。
    這里有一些可能會遇到的正則表達式示例:

    JScript

    VBScript

    匹配

    /^\[ \t]*$/

    "^\[ \t]*$"

    匹配一個空白行。

    /\d{2}-\d{5}/

    "\d{2}-\d{5}"

    驗證一個ID 號碼是否由一個2位數字,一個連字符以及一個5位數字組成。

    /<(.*)>.*<\/\1>/

    "<(.*)>.*<\/\1>"

    匹配一個 HTML 標記。



    下表是元字符及其在正則表達式上下文中的行為的一個完整列表:

    字符

    描述

    \

    將下一個字符標記為一個特殊字符、或一個原義字符、或一個 后向引用、或一個八進制轉義符。例如,'n' 匹配字符 "n"。'\n' 匹配一個換行符。序列 '\\' 匹配 "\" 而 "\(" 則匹配 "("。

    ^

    匹配輸入字符串的開始位置。如果設置了 RegExp 對象的 Multiline 屬性,^ 也匹配 '\n' 或 '\r' 之后的位置。

    $

    匹配輸入字符串的結束位置。如果設置了RegExp 對象的 Multiline 屬性,$ 也匹配 '\n' 或 '\r' 之前的位置。

    *

    匹配前面的子表達式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等價于{0,}。

    +

    匹配前面的子表達式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等價于 {1,}。

    ?

    匹配前面的子表達式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等價于 {0,1}。

    {n}

    n 是一個非負整數。匹配確定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的兩個 o。

    {n,}

    n 是一個非負整數。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等價于 'o+'。'o{0,}' 則等價于 'o*'。

    {n,m}

    m 和 n 均為非負整數,其中n <= m。最少匹配 n 次且最多匹配 m 次。劉, "o{1,3}" 將匹配 "fooooood" 中的前三個 o。'o{0,1}' 等價于 'o?'。請注意在逗號和兩個數之間不能有空格。

    ?

    當該字符緊跟在任何一個其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串 "oooo",'o+?' 將匹配單個 "o",而 'o+' 將匹配所有 'o'。

    .

    匹配除 "\n" 之外的任何單個字符。要匹配包括 '\n' 在內的任何字符,請使用象 '[.\n]' 的模式。

    (pattern)

    匹配pattern 并獲取這一匹配。所獲取的匹配可以從產生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中則使用 $0…$9 屬性。要匹配圓括號字符,請使用 '\(' 或 '\)'。

    (?:pattern)

    匹配 pattern 但不獲取匹配結果,也就是說這是一個非獲取匹配,不進行存儲供以后使用。這在使用 "或" 字符 (|) 來組合一個模式的各個部分是很有用。例如, 'industr(?:y|ies) 就是一個比 'industry|industries' 更簡略的表達式。

    (?=pattern)

    正向預查,在任何匹配 pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始。

    (?!pattern)

    負向預查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始

    x|y

    匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 則匹配 "zood" 或 "food"。

    [xyz]

    字符集合。匹配所包含的任意一個字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

    [^xyz]

    負值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。

    [a-z]

    字符范圍。匹配指定范圍內的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范圍內的任意小寫字母字符。

    [^a-z]

    負值字符范圍。匹配任何不在指定范圍內的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范圍內的任意字符。

    \b

    匹配一個單詞邊界,也就是指單詞和空格間的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

    \B

    匹配非單詞邊界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

    \cx

    匹配由x指明的控制字符。例如, \cM 匹配一個 Control-M 或回車符。 x 的值必須為 A-Z 或 a-z 之一。否則,將 c 視為一個原義的 'c' 字符。

    \d

    匹配一個數字字符。等價于 [0-9]。

    \D

    匹配一個非數字字符。等價于 [^0-9]。

    \f

    匹配一個換頁符。等價于 \x0c 和 \cL。

    \n

    匹配一個換行符。等價于 \x0a 和 \cJ。

    \r

    匹配一個回車符。等價于 \x0d 和 \cM。

    \s

    匹配任何空白字符,包括空格、制表符、換頁符等等。等價于 [ \f\n\r\t\v]。

    \S

    匹配任何非空白字符。等價于 [^ \f\n\r\t\v]。

    \t

    匹配一個制表符。等價于 \x09 和 \cI。

    \v

    匹配一個垂直制表符。等價于 \x0b 和 \cK。

    \w

    匹配包括下劃線的任何單詞字符。等價于'[A-Za-z0-9_]'。

    \W

    匹配任何非單詞字符。等價于 '[^A-Za-z0-9_]'。

    \xn

    匹配 n,其中 n 為十六進制轉義值。十六進制轉義值必須為確定的兩個數字長。例如, '\x41' 匹配 "A"。'\x041' 則等價于 '\x04' & "1"。正則表達式中可以使用 ASCII 編碼。.

    \num

    匹配 num,其中 num 是一個正整數。對所獲取的匹配的引用。例如,'(.)\1' 匹配兩個連續的相同字符。

    \n

    標識一個八進制轉義值或一個后向引用。如果 \n 之前至少 n 個獲取的子表達式,則 n 為后向引用。否則,如果 n 為八進制數字 (0-7),則 n 為一個八進制轉義值。

    \nm

    標識一個八進制轉義值或一個后向引用。如果 \nm 之前至少有is preceded by at leastnm 個獲取得子表達式,則 nm 為后向引用。如果 \nm 之前至少有 n 個獲取,則 n 為一個后跟文字 m 的后向引用。如果前面的條件都不滿足,若  n 和 m 均為八進制數字 (0-7),則 \nm 將匹配八進制轉義值 nm。

    \nml

    如果 n 為八進制數字 (0-3),且 m 和 l 均為八進制數字 (0-7),則匹配八進制轉義值 nml。

    \un

    匹配 n,其中 n 是一個用四個十六進制數字表示的 Unicode 字符。例如, \u00A9 匹配版權符號 (?)。

    經典 Javascript 正則表達式

    正則表達式用于字符串處理,表單驗證等場合,實用高效,但用到時總是不太把握,以致往往要上網查一番。我將一些常用的表達式收藏在這里,作備忘之用。

    匹配中文字符的正則表達式:

    [\u4e00-\u9fa5]

    匹配雙字節字符(包括漢字在內):

    [^\x00-\xff]

    應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)

    String.prototype.len=function(){ return this.replace([^\x00-\xff]/g,"aa").length; }

    匹配空行的正則表達式:

    \n[\s|]*\r

    匹配HTML標記的正則表達式:

    /<(.*)>.*<\/\1>|<(.*) \/>/

    匹配首尾空格的正則表達式:

    (^\s*)|(\s*$)

    應用:j avascript中沒有像v bscript那樣的trim函數,我們就可以利用這個表達式來實現,如下:

    String.prototype.trim = function()
    {
        return this.replace(/(^\s*)|(\s*$)/g, "");
    }

    利用正則表達式分解和轉換IP地址
    下面是利用正則表達式匹配IP地址,并將IP地址轉換成對應數值的Javascript程序:

    function IP2V(ip)
    {
        re=/(\d+)\.(\d+)\.(\d+)\.(\d+)/g  //匹配IP地址的正則表達式
        if(re.test(ip))
        {
            returnRegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1
        }
        else
        {
            throw new Error("Not a valid IP address!")
        }
    }

    不過上面的程序如果不用正則表達式,而直接用split函數來分解可能更簡單,程序如下:

    var ip="10.100.20.168"
    ip=ip.split(".")
    alert("IP值是:"+(ip[0]*255*255*255+ip[1]*255*255+ip[2]*255+ip[3]*1))

    匹配Email地址的正則表達式:

    \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*

    匹配網址URL的正則表達式:

    http://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?

    利用正則表達式去除字串中重復的字符的算法程序:[*注:此程序不正確]

    var s="abacabefgeeii"
    var s1=s.replace(/(.).*\1/g,"$1")
    var re=new RegExp("["+s1+"]","g")
    var s2=s.replace(re,"")
    alert(s1+s2)  //結果為:abcefgi

    *注
    ===============================
    如果var s = “abacabefggeeii”
    結果就不對了,結果為:abeicfgg
    正則表達式的能力有限
    ===============================

    我原來在CSDN上發貼尋求一個表達式來實現去除重復字符的方法,最終沒有找到,這是我能想到的最簡單的實現方法。思路是使用后向引用取出包括重復的字符,再以重復的字符建立第二個表達式,取到不重復的字符,兩者串連。這個方法對于字符順序有要求的字符串可能不適用。

    得用正則表達式從URL地址中提取文件名的javascript程序,如下結果為page1

    s="http://blog.penner.cn/page1.htm"
    s=s.replace(/(.*\/){ 0, }([^\.]+).*/ig,"$2")
    alert(s)

    利用正則表達式限制網頁表單里的文本框輸入內容:

    用正則表達式限制只能輸入中文:

    onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,'')"onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\u4E00-\u9FA5]/g,''))"

    用正則表達式限制只能輸入全角字符:

    onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,'')"onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\uFF00-\uFFFF]/g,''))"

    用正則表達式限制只能輸入數字:

    onkeyup="value=value.replace(/[^\d]/g,'')"onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

    用正則表達式限制只能輸入數字和英文:

    onkeyup="value=value.replace(/[\W]/g,'')"onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^\d]/g,''))"

    匹配非負整數(正整數 + 0)

    ^\d+$

    匹配正整數

    ^[0-9]*[1-9][0-9]*$

    匹配非正整數(負整數 + 0)

    ^((-\d+)|(0+))$

    匹配負整數

    ^-[0-9]*[1-9][0-9]*$

    匹配整數

    ^-?\d+$

    匹配非負浮點數(正浮點數 + 0)

    ^\d+(\.\d+)?$

    匹配正浮點數

    ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$

    匹配非正浮點數(負浮點數 + 0)

    ^((-\d+(\.\d+)?)|(0+(\.0+)?))$

    匹配負浮點數

    ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$

    匹配浮點數

    ^(-?\d+)(\.\d+)?$

    匹配由26個英文字母組成的字符串

    ^[A-Za-z]+$

    匹配由26個英文字母的大寫組成的字符串

    ^[A-Z]+$

    匹配由26個英文字母的小寫組成的字符串

    ^[a-z]+$

    匹配由數字和26個英文字母組成的字符串

    ^[A-Za-z0-9]+$

    匹配由數字、26個英文字母或者下劃線組成的字符串

    ^\w+$

    匹配email地址

    ^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$

    匹配url

    ^[a-zA-z]+://匹配(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$

    匹配html tag

    <\s*(\S+)(\s[^>]*)?>(.*?)<\s*\/\1\s*>

    Visual Basic & C# Regular Expression
    1.確認有效電子郵件格式
    下面的示例使用靜態 Regex.IsMatch 方法驗證一個字符串是否為有效電子郵件格式。如果字符串包含一個有效的電子郵件地址,則 IsValidEmail 方法返回 true,否則返回 false,但不采取其他任何操作。您可以使用 IsValidEmail,在應用程序將地址存儲在數據庫中或顯示在 ASP.NET 頁中之前,篩選出包含無效字符的電子郵件地址。

    [Visual Basic]

    Function IsValidEmail(strIn As String) As Boolean
    ' Return true if strIn is in valid e-mail format.
    Return Regex.IsMatch(strIn, ("^([\w-\.]+)@((\[[0-9]{ 1,3 }\.[0-9]{ 1,3 }\.[0-9]{ 1,3 }\.)|(([\w-]+\.)+))([a-zA-Z]{ 2,4 }|[0-9]{ 1,3 })(\]?)$")
    End Function

    [C#]

    bool IsValidEmail(string strIn)
    {
    // Return true if strIn is in valid e-mail format.
    return Regex.IsMatch(strIn, @"^([\w-\.]+)@((\[[0-9]{ 1,3 }\.[0-9]{ 1,3 }\.[0-9]{ 1,3 }\.)|(([\w-]+\.)+))([a-zA-Z]{ 2,4 }|[0-9]{ 1,3 })(\]?)$");
    }

    2.清理輸入字符串
    下面的代碼示例使用靜態 Regex.Replace 方法從字符串中抽出無效字符。您可以使用這里定義的 CleanInput 方法,清除掉在接受用戶輸入的窗體的文本字段中輸入的可能有害的字符。CleanInput 在清除掉除 @、-(連字符)和 .(句點)以外的所有非字母數字字符后返回一個字符串。

    [Visual Basic]

    Function CleanInput(strIn As String) As String
    ' Replace invalid characters with empty strings.
    Return Regex.Replace(strIn, "[^\w\.@-]", "")
    End Function

    [C#]

    String CleanInput(string strIn)
    {
        // Replace invalid characters with empty strings.
        return Regex.Replace(strIn, @"[^\w\.@-]", "");
    }

    3.更改日期格式
    以下代碼示例使用 Regex.Replace 方法來用 dd-mm-yy 的日期形式代替 mm/dd/yy 的日期形式。

    [Visual Basic]

    Function MDYToDMY(input As String) As String
    Return Regex.Replace(input, _
    "\b(?<month>\d{ 1,2 })/(?<day>\d{ 1,2 })/(?<year>\d{ 2,4 })\b", _
    "${ day }-${ month }-${ year }")
    End Function

    [C#]

    String MDYToDMY(String input)
    {
        return Regex.Replace(input,"\\b(?<month>\\d{ 1,2 })/(?<day>\\d{ 1,2 })/(?<year>\\d{ 2,4 })\\b","${ day }-${ month }-${ year }");
    }

    Regex 替換模式
    本示例說明如何在 Regex.Replace 的替換模式中使用命名的反向引用。其中,替換表達式 ${ day } 插入由 (?…) 組捕獲的子字符串。

    有幾種靜態函數使您可以在使用正則表達式操作時無需創建顯式正則表達式對象,而 Regex.Replace 函數正是其中之一。如果您不想保留編譯的正則表達式,這將給您帶來方便

    4.提取 URL 信息
    以下代碼示例使用 Match.Result 來從 URL 提取協議和端口號。例如,“http://www.penner.cn:8080……將返回“http:8080”。

    [Visual Basic]

    Function Extension(url As String) As String
    Dim r As New Regex("^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/", _
    RegexOptions.Compiled)
    Return r.Match(url).Result("${ proto }${ port }")
    End Function

    [C#]

    String Extension(String url)
    {
        Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",
        RegexOptions.Compiled);
        return r.Match(url).Result("${ proto }${ port }");
    }

    只有字母和數字,不小于6位,且數字字母都包含的密碼的正則表達式
    在C#中,可以用這個來表示:

    "\w{ 6 }(\w+)*"

    一個將需要將路徑字符串拆分為根目錄和子目錄兩部分的算法程序,考慮路徑格式有:C:\aa\bb\cc ,\\aa\bb\cc , ftp://aa.bb/cc 上述路徑將分別被拆分為:C:\和aa\bb\cc ,\\aa 和 \bb\cc , ftp:// 和 aa.bb/cc 用javascript實現如下:

    var strRoot,strSub
    var regPathParse=/^([^\\^\/]+[\\\/]+|\\\\[^\\]+)(.*)$/
    if(regPathParse.test(strFolder))
    {
        strRoot=RegExp.$1
        strSub=RegExp.$2
    }

    說了這么多了,我們來看一些正則表達式的實際應用的例子:

    E-mail地址驗證:
     function test_email(strEmail) {
      var myReg = /^[_a-z0-9]+@([_a-z0-9]+\.)+[a-z0-9]{2,3}$/;
      if(myReg.test(strEmail)) return true;
      return false;
     }
    HTML代碼的屏蔽
     function mask_HTMLCode(strInput) {
       var myReg = /<(\w+)>/;
       return strInput.replace(myReg, "<$1>");
     }

    正則表達式對象的屬性及方法
    預定義的正則表達式擁有有以下靜態屬性:input, multiline, lastMatch, lastParen, leftContext, rightContext和$1到$9。其中input和multiline可以預設置。其他屬性的值在執行過exec或test方法后被根據不同條件賦以不同的值。許多屬性同時擁有長和短(perl風格)的兩個名字,并且,這兩個名字指向同一個值。(JavaScript模擬perl的正則表達式)
    正則表達式對象的屬性 屬性 含義 
    $1...$9 如果它(們)存在,是匹配到的子串 
    $_ 參見input 
    $* 參見multiline 
    $& 參見lastMatch 
    $+ 參見lastParen 
    $` 參見leftContext 
    $’          參見rightContext 
    constructor    創建一個對象的一個特殊的函數原型 
    global       是否在整個串中匹配(bool型) 
    ignoreCase     匹配時是否忽略大小寫(bool型) 
    input        被匹配的串 
    lastIndex     最后一次匹配的索引 
    lastParen     最后一個括號括起來的子串 
    leftContext    最近一次匹配以左的子串 
    multiline     是否進行多行匹配(bool型) 
    prototype     允許附加屬性給對象 
    rightContext    最近一次匹配以右的子串 
    source       正則表達式模式 
    lastIndex     最后一次匹配的索引 
     

    正則表達式對象的方法
    方法 含義 
    compile      正則表達式比較 
    exec        執行查找 
    test        進行匹配 
    toSource      返回特定對象的定義(literal representing),其值可用來創建一個新的對象。重載Object.toSource方法得到的。 
    toString      返回特定對象的串。重載Object.toString方法得到的。 
    valueOf      返回特定對象的原始值。重載Object.valueOf方法得到 
     
    例子

    將輸出"Smith, John"

      相關評論

      閱讀本文后您有什么感想? 已有人給出評價!

      • 8 喜歡喜歡
      • 3 頂
      • 1 難過難過
      • 5 囧
      • 3 圍觀圍觀
      • 2 無聊無聊

      熱門評論

      最新評論

      發表評論 查看所有評論(0)

      昵稱:
      表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
      字數: 0/500 (您的評論需要經過審核才能顯示)
      女人让男人桶30分钟免费视频,女人张开腿让男人桶个爽,一进一出又大又粗爽视频
    • <td id="ae6ms"><li id="ae6ms"></li></td>
    • <xmp id="ae6ms"><td id="ae6ms"></td><table id="ae6ms"></table>
    • <table id="ae6ms"></table>
    • <td id="ae6ms"></td>
      <td id="ae6ms"></td>
    • <table id="ae6ms"></table><table id="ae6ms"><td id="ae6ms"></td></table>
    • <td id="ae6ms"></td>
    • <table id="ae6ms"><li id="ae6ms"></li></table>
    • <table id="ae6ms"></table>