<s id="2e0qm"><div id="2e0qm"></div></s>
<div id="2e0qm"><button id="2e0qm"></button></div>
<small id="2e0qm"></small>
<div id="2e0qm"></div>
<div id="2e0qm"><s id="2e0qm"></s></div>
<div id="2e0qm"><button id="2e0qm"></button></div>
主頁 > 知識庫 > 網頁基礎 > Javascript/Ajax >
欄目列表

javascript掌握正則表達式

來源:中國IT實驗室 作者:佚名 發表于:2013-01-17 18:05  點擊:
我想正則表達式之所以難,主要體現在以下幾個方面: 1)正則表達式的符號晦澀難懂 2)不支持排版(至少javascript目前還不支持) 3)不能設置斷點,不能跟蹤調試 4)沒有真正的標準,不同工具所支持的正則表達式有許多細節上的差異 下文中如涉及正則表達式符
我想正則表達式之所以難,主要體現在以下幾個方面:    1)正則表達式的符號晦澀難懂
    2)不支持排版(至少javascript目前還不支持)
    3)不能設置斷點,不能跟蹤調試
    4)沒有真正的標準,不同工具所支持的正則表達式有許多細節上的差異
    下文中如涉及正則表達式符號含義不明,請參閱《javascript正則表達式入門筆記(完整版)》
    正則表達式本質上是一整套的處理字符串的模型,幫助人們利用簡短的表達式來實現復雜的算法。早期的正則表達式引擎只有三百多行代碼,發展到后來也不到1萬 行代碼。打一個不恰當的比喻,利用正則表達式處理字符串,就像是利用SQL處理數據。正如我們在處理數據時要避免使用復雜SQL,我們在處理字符串時也應 當避免使用復雜的正則表達式。下面是一段判斷IP地址合法性的代碼,比單純用正則表達式要簡單:
    var isIPAdress = function(IPStr){
    var pttrn = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
    var IPObj = pttrn.exec(IPStr);
    var bool_result = false;
    if(IPObj){
    //添加進一步的識別規則
    if(IPStr==="0.0.0.0"){
    bool_result = false;
    }else if(IPStr==="1.1.1.1"){
    bool_result = false;
    }else if(IPObj[1]>=0 && IPObj[1]<=255 && IPObj[2]>=0 && IPObj[2]<=255 && IPObj[3]>=0 && IPObj[3]<=255 && IPObj[4]>=0 && IPObj[4]<=255){
    bool_result = true;
    }else{
    bool_result = false;
    }
    }
    return bool_result;
    }
    調試信息:
    isIPAdress("10.1.6.255")    true
    isIPAdress("1.1.1.1")    false
    isIPAdress("10.1.a.255")    false
    淺議正則表達式的執行效率
    執行下面這個javascript的正則表達式,比較ie/safari/firefox/chrome的執行效率,發現safari和firefox首 次打開時較慢但是再刷新可做到瞬間完成,chrome和ie則是每次打開和刷新都慢,這說明javascript在ie和chrome上還是完全基于 NFA算法做優化,safari和firefox則可能用到了DFA算法(也可能是緩存)。
    var p1 = /X(?:.+)+X/;
    iJs.put(p1.exec("=XX=========================="));
    正則表達式對象:exec方法:
    如果正則表達式使用了g作為后綴,則會記住上次執行的結果,執行時會找后面匹配。
    如果正則表達式沒有使用g作為后綴,則每次執行的結果相同,都是取第一個匹配上的。如果使用了捕獲型括號,則匹配結果可通過1/2/3/…后綴獲得,參見前面給出的判斷IP地址合法性的代碼。
    var pttrn = /bb/;
    iJs.showObject(pttrn.exec("abaabbaaa"));
    iJs.showObject(pttrn.exec("abaabbaaa"));
    pttrn = /a+/g;
    iJs.showObject(pttrn.exec("abaabbaaa"));
    iJs.showObject(pttrn.exec("abaabbaaa"));
    調試信息:
    [Object] bb
    |--[string] 0 ------------- bb
    |--[number] index ------------- 4
    |--[string] input ------------- abaabbaaa
    |--[number] lastIndex ------------- 6
    [Object] bb
    |--[string] 0 ------------- bb
    |--[number] index ------------- 4
    |--[string] input ------------- abaabbaaa
    |--[number] lastIndex ------------- 6
    [Object] a
    |--[string] 0 ------------- a
    |--[number] index ------------- 0
    |--[string] input ------------- abaabbaaa
    |--[number] lastIndex ------------- 1
    [Object] aa
    |--[string] 0 ------------- aa
    |--[number] index ------------- 2
    |--[string] input ------------- abaabbaaa
    |--[number] lastIndex ------------- 4
    正則表達式對象:test方法
    返回true或false
    var pttrn = /bb/;
    iJs.pt('pttrn.test("abaabbaaa")');
    iJs.pt('pttrn.test("ababab")');
    調試信息:
    pttrn.test("abaabbaaa")    true
    pttrn.test("ababab")    false
    字符串對象:match方法
    match方法返回一個對象,需注意如果正則表達式使用了后綴g,則捕獲型括號會失效。
    var pttrn = /a(b)+/;
    var pttrn_g = /a(b)+/g;
    var myStr = "abaabbaaa";
    var matchObj = myStr.match(pttrn);//捕獲b
    var matchObj_g = myStr.match(pttrn_g); //捕獲失效
    iJs.pt("pttrn");
    iJs.pt("pttrn_g");
    iJs.pt("myStr");
    iJs.showObject("matchObj");
    iJs.showObject("matchObj_g");
    調試信息:
    pttrn    /a(b)+/
    pttrn_g    /a(b)+/g
    myStr    abaabbaaa
    [Object] matchObj
    |--[string] 0 ------------- ab
    |--[string] 1 ------------- b
    |--[number] index ------------- 0
    |--[string] input ------------- abaabbaaa
    |--[number] lastIndex ------------- 2
    [Object] matchObj_g
    |--[string] 0 ------------- ab
    |--[string] 1 ------------- abb
    |--[number] index ------------- 3
    |--[string] input ------------- abaabbaaa
    |--[number] lastIndex ------------- 6
    字符串對象:replace方法
    如果replace第一個參數輸入的是字符串或不帶后綴的正則表達式,則只匹配替換一次。
    只有正則表達是帶后綴g才能替換全部。
    第二個參數可以是函數,下面的例子中打印了函數接受的參數結構。第一個參數是匹配字符串、第二個參數開始是捕獲字符串、然后跟著index、最后是字符串自己。
    var myStr = "abaabbaaabbb";
    var searchValue = "a";
    var searchRegExp = /a+/;
    var searchRegExp_g = /a+/g;
    var replaceValue = "X";
    iJs.pt("myStr");
    iJs.pt("searchValue");
    iJs.pt("replaceValue");
    iJs.pt("myStr.replace(searchValue,replaceValue)");
    iJs.put("");
    iJs.pt("myStr");
    iJs.pt("searchRegExp");
    iJs.pt("replaceValue");
    iJs.pt("myStr.replace(searchRegExp,replaceValue)");
    iJs.put("");
    iJs.pt("myStr");
    iJs.pt("searchRegExp_g");
    iJs.pt("replaceValue");
    iJs.pt("myStr.replace(searchRegExp_g,replaceValue)");
    iJs.put("");
    var myStr_f = "a2aa22aaa222________";
    var searchRegExp_g2 = /(a+)2/g;
    var args;//全局變量便于iJs1捕獲對象
    var replaceFunction = function(a,b){
    var slice = Array.prototype.slice;
    args = slice.apply(arguments);
    iJs1.showObject("args");
    return args[0]+"+";
    };
    iJs.pt("myStr_f.replace(searchRegExp_g2,replaceFunction)");
    調試信息:
    myStr    abaabbaaabbb
    searchValue    a
    replaceValue    X
    myStr.replace(searchValue,replaceValue)    Xbaabbaaabbb
    myStr    abaabbaaabbb
    searchRegExp    /a+/
    replaceValue    X
    myStr.replace(searchRegExp,replaceValue)    Xbaabbaaabbb
    myStr    abaabbaaabbb
    searchRegExp_g    /a+/g
    replaceValue    X
    myStr.replace(searchRegExp_g,replaceValue)    XbXbbXbbb
    myStr_f.replace(searchRegExp_g2,replaceFunction)    a2+aa2+2aaa2+22________
    補充調試信息:
    [Object] args
    |--[string] 0 ------------- a2
    |--[string] 1 ------------- a
    |--[number] 2 ------------- 0
    |--[string] 3 ------------- a2aa22aaa222________
    [Object] args
    |--[string] 0 ------------- aa2
    |--[string] 1 ------------- aa
    |--[number] 2 ------------- 2
    |--[string] 3 ------------- a2aa22aaa222________
    [Object] args
    |--[string] 0 ------------- aaa2
    |--[string] 1 ------------- aaa
    |--[number] 2 ------------- 6
    |--[string] 3 ------------- a2aa22aaa222________
    字符串對象:search方法
    search方法和indexOf方法類似,但是接受的是正則表達式對象,如果能夠匹配,則返回首次匹配的首字符位置,如果不能匹配,則返回-1。此方法會忽略g標志。
    var myStr = "abaabbaaabbb";
    var searchRegExp1 = /aaa/;
    iJs.pt("myStr.search(searchRegExp1)");
    var searchRegExp2 = /aXa/;
    iJs.pt("myStr.search(searchRegExp2)");
    調試信息:
    myStr.search(searchRegExp1)    6
    myStr.search(searchRegExp2)    -1

    有幫助
    (1)
    100%
    沒幫助
    (0)
    0%
    真人女荫道口100种图片
    <s id="2e0qm"><div id="2e0qm"></div></s>
    <div id="2e0qm"><button id="2e0qm"></button></div>
    <small id="2e0qm"></small>
    <div id="2e0qm"></div>
    <div id="2e0qm"><s id="2e0qm"></s></div>
    <div id="2e0qm"><button id="2e0qm"></button></div>