Javascript正則表達式
在Web開發中,常常會遇到各種參數檢驗的問題,使用正則表達式能夠達到讓校驗代碼精簡、清晰等效果。本文整理了正則表達式使用中最基礎和常用的知識,以供參考。
一創建正則表達式對象
var pattern =/ s$///直接量語法創建RegExp對象。
var pattern = new RegExp(“s$”)//構造函數方法
直接量字符
正則表達式中所有的字母字符和數字都是按照直接量與自身相匹配的。但是一些非字母字符則要藉助於反斜杆(\)轉意字符。二者統稱爲正則表達式的直接量字符。見表:
將單獨的直接量字符放進方括號內就可以組成字符類。
字符類
重複
貪婪重複模式:
貪婪重複模式總是儘可能多的匹配符合它規則的字符。
非貪婪模式:
在修飾匹配次數的特殊符號後再加上一個 "?" 號,則可以使匹配次數不定的表達式儘可能少的匹配,使可匹配可不匹配的表達式,儘可能的 "不匹配"。這種匹配原則叫作 "非貪婪" 模式,也叫作 "勉強" 模式。如果少匹配就會導致整個表達式匹配失敗的時候,與貪婪模式類似,非貪婪模式會最小限度的再匹配一些,以使整個表達式匹配成功。
重複模式舉例:
<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 隨後要跟一個冒號。
標誌
標誌在表達式模式串的“/”之外。
二使用正則表達式
String
RegExp
String進一步
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"”。
RegExp進一步
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);
}