在Web開發中,經常會遇到各類參數檢驗的問題,使用正則表達式可以達到讓校驗代碼精簡、清晰等效果。本文整理了正則表達式使用中最基礎和經常使用的知識,以供參考。javascript
var pattern =/ s$///直接量語法建立RegExp對象。java
var pattern = new RegExp(「s$」)//構造函數方法正則表達式
正則表達式中全部的字母字符和數字都是按照直接量與自身相匹配的。可是一些非字母字符則要藉助於反斜杆(\)轉意字符。兩者統稱爲正則表達式的直接量字符。見表:數組
將單獨的直接量字符放進方括號內就能夠組成字符類。ide
貪婪重複模式:函數
貪婪重複模式老是儘量多的匹配符合它規則的字符。ui
非貪婪模式:url
在修飾匹配次數的特殊符號後再加上一個 "?" 號,則能夠使匹配次數不定的表達式儘量少的匹配,使可匹配可不匹配的表達式,儘量的 "不匹配"。這種匹配原則叫做 "非貪婪" 模式,也叫做 "勉強" 模式。若是少匹配就會致使整個表達式匹配失敗的時候,與貪婪模式相似,非貪婪模式會最小限度的再匹配一些,以使整個表達式匹配成功。spa
重複模式舉例:對象
<script type="text/javascript" charset="UTF-8">
try{
str="<p>abcdefg</p><p>abcdefghijkl</p>";
re1=str.match(/<p>[\W\w]+?<\/p>/ig);
alert("非貪婪模式:\r\n\r\n1:"+re1[0]+"\r\n2:"+re1[1]);
// 輸出結果:re1[0]——<p>abcdefg</p>,re1[1]——<p>abcdefghijkl</p>
re1=str.match(/<p>[\W\w]+<\/p>/ig);
alert("貪婪模式:\r\n\r\n"+re1);
// 輸出結果:re1——<p>abcdefg</p><p>abcdefghijkl</p>
re1=str.match(/<p>(.+?)<\/p>/i);
alert("非貪婪模式,且不要標記:\r\n\r\n1:"+re1[1]);
// 輸出結果:re1[1]——abcdefg
re1=str.match(/<p>(.+)<\/p>/i);
alert("貪婪模式,且不要標記:\r\n\r\n"+re1[1]);
// 輸出結果:re1[1]——abcdefg</p><p>abcdefghijkl
}catch(e){
alert(e.description);
}
</script>
正則表達式的選擇、分組和引用
舉例:
選擇:/ ab | cd | ef /匹配的是字符串「ab」、」cd」、「ef」中的任意一個字符串。
組合:
(1) /java(script)?/ script字符串被組合成一個單元,這個單元就像前面所看見的一個直接量字符,它和?一塊兒用的時候表示,script可選,即匹配「java」或「javascript」。
(2) /[‘」][^’「]*[‘「]/ 和 / [‘」][^’「]*\1/ 有什麼區別?區別就是前者能夠匹配字符串「a」,也能夠匹配字符串「a’;然後者只能匹配「a」,或‘a’。那麼,「\1」的做用是什麼?在同一個正則表達式中,用「\n」(在後部)來引用前面的子表達式。第一個正則表達式中第一個引號和第二個引號能夠同樣也能夠不同,如第一個爲單引號,而第二個爲雙引號;但第二個正則表達式的第一個引號和第二個引號必定是相同的。而第二個表達式的\1的意思是引用該正則表達式中的第一個子表達式,並且,引用的不是子表達式模式([‘」]),而是引用第一個子表達式的匹配的文本(意思是,若是第一個子表達式匹配的是單引號,那麼引用的就是一個單引號)
(3) /([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*) / 和/ ( [Jj]ava([Ss]cript)? ) \sis\s(fun\w*) / 又有什麼區別?即(?:…)和()一樣用來把元素組合爲一個單元,有什麼區別?那就是前者不做爲上一例子提到的\n引用,然後者能夠,也就是說,若是在各自的正則表達式裏增長\2,那麼前者引用的是(fun\w*)匹配的結果,後者則引用([Ss]cript)? )匹配的結果。
正則表達式的錨字符,指定匹配的位置
舉例:
/^javascript$/ 能夠匹配字符串「javascirpt」;
/\bjava\b/匹配單個「java」,而不能匹配「javascirpt」;
/\B[Ss]cript/ 匹配「javascirpt」,或者「vbscript」,但不匹配「script」或者」scirpting」
/java(scirpt)?(?=\:)/ 匹配」javascript:The Definitive Guide」,但不能匹配「javascript in fun」由於匹配的條件是javascript或java 隨後要跟一個冒號。
標誌在表達式模式串的「/」以外。
replace的第二個參數能夠利用正則表達式的「記憶功能」,用$n能夠引用第一個參數(正則表達式)相應的與子表達式相匹配的結果。如:
var text = ' " 這裏是第一個子表達式匹配的內容" ';
var quote= /" ( [^\"]*)" / g//正則表達式中只有一個括號,即只有一個子表達式
text.replace(quote, "「$1」"); //$1爲第一個子表達式匹配的結果,即字符串" 這裏是第一個子表達式匹配的內容" ,替換的結果是英文引號變爲了中文格式的引號即「這裏是第一個子表達式匹配的內容」
match注意正則表達式非全局搜索
若是是全局搜索返回數組是全部的匹配結果,這沒什麼複雜。若是不是全局搜索,那麼數組的第一個元素是匹配的字符串,餘下的元素是正則表達式中用括號括起來的子表達式。
舉例:
var url = /(\w+):\ / \ //( [\w.]+)\ /(\S*) /;//非全局搜索
var text =" Visit my blog at http:// / www.example.com/~david"
var result = text.match(url);
if (result!=null) {
var fullurl = result[0]; //第一個元素是匹配結果
var protocol = result[1]; //下標爲i 的元素是正則表達式中第i個子表達式的匹配結果
var host = result[2];
var path = result[3];
除此以外,非全局的正則表達式返回的數組還有兩個屬性——index和input, 前者字符串中匹配開始處的字符的位置,例如這裏是17,後者是目標字符串的一個副本,例如這裏是「Visit my blog at http:// / www.example.com/~david"」。
exec注意全局搜索
當有一個g標誌的正則表達式調用exec()時,它將把該正則表達式對象的lastIndex屬性設置爲緊接着匹配子串的字符位置。當同一個正則表達式第二次調用exec()時,它將從lastIndex屬性所指示的字符處開始檢索。若是沒有發現任何匹配,它會將lastIndex屬性重置爲0。
舉例:
var pattern =/ java/g
var text = " javascript is more fun than java!";
var result ;
while((result = pattern.exec(text))! = null ){
alert("Matched ' " +result[0]+ " ' "+ " at position "+result.index + "; next search begins at " + pattern .lastIndex);
}