JavaScript正則表達式:
正則表達式的字面語法格式
一個正則表達式的格式如下:
/由字符、字符類、特殊字符類、分組符、位置指示符、轉義碼、重複計量器、可選量符號組成的字符串/正則表達式標記
如:/^(http)[1-3]{2,4}\d\w$/ig
正則表達式標記:
正則表達式位置指示符:規定模式在它所匹配的字符串裏的位置。
可以同時使用這兩個位置指示符來確保精確的匹配給定的模式,如:/^http$/ 將只匹配http。
轉義碼:
用在正則表達式中的轉義碼是用在字符串中的轉義碼的超集(在正則表達式中有很多帶特殊含義的字符如^和$等)。
正則表達式的重複計量器:指定某個字符或字符組合可以或者必須出現的次數。
分組符”()”:在使用重複計量器時可以將字符用()組合起來作爲一個項目
如:/a(34)+c/ 匹配任何含有一個a跟隨一個或者多個”34”再緊跟一個c的字符串。
字符類:
可以使用[]指定一個有效的字符集合
如:/[123]/ 匹配任何含有1、2、3數字的字符串。
在[]中可以使用減號” - ”符指定取值範圍
如: /[0-9a-z]/ 匹配任何含有數字和小寫字母的字符串
在[]中還可以使用” ^ ”來指定不能出現的字符類
如:/[^a-zA-Z]/ 將匹配任何一個至少含有一個非字母字符的字符串
其他特殊字符類:
子表達式:正則表達式可以用”()”分組,用於RegExp對象自身來訪問子表達式成分
如:var pattern = /(\w+) ([\d-]+)/;
var customer = “Alan 555-2334”;
pattern.test(customer);
alert(“1=“+RegExp.1
+ “\n2=”+RegExp.2);
會顯示:
” 1=Alan””2=
555-2334”
注意:根據ECMA的規定,可以訪問的子表達式不止9個,還可以用10,11……,一直達到99個之多,這主要取決於瀏覽器是否支持。
可選量符號”|”:可以使用”|”來指示幾個條目的邏輯“或”關係
如:/^(http|ftp|https)/ 可以匹配以” http”、” ftp”或” https”開頭的字符串。
/abc|(xyz){3}/ 匹配包含有” abc”或者” xyz xyz xyz”的字符串
一些常用正則表達式的例子:
/\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}/ 匹配如 125.0.0.2之類的ip地址
/^(http|ftp|https):\/\/.*/ 匹配諸如 http://jdskfk之類的url地址
/\w+@\w+.\w{1,3}/ 匹配諸如 [email protected]之類的email地址{1,3}表示後綴只可能是cn.,gov,com,org之類的域名後綴
RegExp對象
構造正則表達式的兩種方法:
1、 var pattern=/dsfdsf/i
2、 var pattern= new RegExp(“dsfdsf”,”i”)
RegExp對象的方法:
1、 test(“sjdalkfjlsd”)——-返回true或者false
2、 compile(“”,””)———–用新的正則表達式替代舊的正則表達式:不常用.
3、 exec(“dsafsda”)———-返回帶有很多屬性的數組:包括該數組的長度length;顯示輸入的原始字符串input;保存第一次匹配的索引的index;以及保存第一次匹配以後接下來的搜索開始處字符所對應的索引lastIndex。(從0開始計數)。例如:
var pattern=/cat/;
var result=pattern.exec(“he is a big cat,a fatjdfjlkdj”);
則result=”cat”;result.length=1;result.index=12;result.lastIndex=15;
result.input=” he is a big cat,a fatjdfjlkdj”
如果不能匹配,則result=null;
如果使用了子表達式,則返回的數組元素將不止一個。
如:
var pattern= /(cat)(and)(dog)/
var result=pattern.exec(“my cat and dog are black.”)
則 result= cat and dog,cat,and,dog
result.length=4;result.index=3;result.lastIndex=15;
result.input= my cat and dog are black.
注意:exec()方法將整個匹配的字符串放到返回數組的第一個元素,lastIndex屬性指向最後一個匹配的字符串的最後一個字符的下一個位置。 此外,exec()方法在執行全局匹配的時候只返回第一個匹配,所有,需要返回多個匹配的時候,最好使用後面所要介紹的String的match()方法.
RegExp對象的實例屬性
RegExp對象的靜態屬性(全局變量)
正則表達式的Stirng方法
search(): 返回第一個匹配的子字符串開始字符的索引或者-1(沒有找到任何匹配)
如:”javascript regular expressions are powerful!”.search(/pow.*/i)=35;
而:”javascript regular expressions are powerful!”.search(/\d/i)=-1;
split():將字符串分成子字符串,並以數組的形式返回
如:var string=”10/3//4/7/9”;var splitExp=/[\/]+/;myArray=string.split(splitExp);
則myArray[0]=”10”; myArray[1]=”3”;……;myArray[4]=”9”;
replace():返回字符串,用第二個參數替換匹配第一個參數(一個正則表達式)的文本所得到的結果。可以指定是否全局匹配。
如:s=”hello.regexps are fun.”.replace(/./g,”!”)將返回”hello!regexps are fun!”.
可用該方法實現自己的Trim方法,如:
function Trim(inputStr){ return inputStr.replace(/(^\s*)|(\s*$)/g,”“); }
match()方法:使用一個正則表達式爲爲參數,返回包含了匹配結果的數組。
如:var pattern=/\d{2}/g;var n=”22,33,33,33”;var result=n.match(pattren);
則result[0]=”22”; …. result[3]=”33”;
高級正則表達式:
/^.*$/gm:可以將一段多段落文字按換行符分解到幾個字符串裏。
如:var text=”this is a multiplane lines\n this is a 2nd lines\n this is a 3th lines”
var lines=text.match(“/^.*$/gm”); 則
lines[0]= ”this is a multiplane lines”;
lines[1]= ”this is a 2nd lines”;
lines[2]= ”this is a 3th lines”;
(?:):規定加括號內的子表達式不能被捕獲。
如:var pattern=/(?:abc)(def)/
var text=”abcdef”.replace(pattern,”ksdkfj:$1”)將返回:”ksdkfj: def”;
如果pattern=/(abc)(def)/則返回:” ksdkfj: abc”。
(?=):規定只有在某條目後面緊跟着包含在(?=)中的表達式時,纔會對前面的條目匹配。
如:var pattern=/\d(?=.\d+)/ 匹配”3.3 “、”3.14”,但不匹配”3”或”3.” 。
(?!):與(?=)正好相反。
如:var pattern=/\d(?!.\d+)/匹配”3 “但不匹配”3.3 “,”3.14”
正則表達式的侷限性:
1、 匹配要求的複雜性使得不可能滿足任意想要的匹配模式;
2、 只能對語法而不能對語義的有效性進行驗證。例如:025-1234567是合法的電話號碼,但不一定是實際存在的電話號碼。