正則表達式-理論基礎篇
正則表達式-理論基礎篇
-
什么是正則表達式?
</li>
可以稱作規則一個描述字符模式的對象,正則表達式中的字母和數字,都是按照字面含義進行匹配的。強大的字符串匹配工具 -
如何建立一個正則表達式?
</li> </ul>-
使用RegExp()構造函數來創建RegExp對象
</li> -
特殊的直接量語法來創建,定義為包含在一對斜杠(/)之間的字符
</li> </ol>例:var reg = /s$/;,var reg = new RegExp(s$);
兩者效果完全相同,用來匹配所有以字母“s”結尾的字符串。“文本模式”的正則表達式語法
1.直接量字符
非字母的字符匹配,這些字符需要通過反斜線(\)作前綴進行轉義.
</blockquote>字 符 匹 配 </tr> </tbody>字母和數字字符 自身 </tr>\o NUL字符 </tr>\t 制表符 </tr>\n 換行符 </tr>\v 垂直制表符 </tr>\f 換頁符 </tr>\r 回車符 </tr>\xnn 由十六進制數nn指定的拉丁字符,例:\x0A等價于\n </tr>\uxxxx 由十六進制數xxxx指定的unicode字符,例:\u0009等價于\t </tr>\cX 控制字符^X,例:\cJ等價于換行符\n </tr> </tbody> </table>-
具有特殊含義的標點符號:
</li> </ul>^,$,.,*,+,?,=,!,:,|,\,/,(,),[,],{,}
想在正則表達式中使用這些字符的直接量進行匹配,則必須使用前綴"\",其他標點符號(比如@和引號)無特殊含義,在正則表達式中按照字面含義進行匹配。
2.字符類.
方括號,或,范圍
將直接量字符單獨放進方括號內就組成了字符類。一個字符類可以匹配它包含的任意字符。字符類可以使用連字符來表示字符范圍。
</blockquote>字 符 含 義 </tr> </tbody>[...] 方括號內的任意字符 </tr>[^...] 不在方括號內的任意字符 </tr>. 除換行符合其他unicode行終止符之外的任意字符 </tr>\w 任何ASCII符組成的的單詞,等同[a-zA-Z0-9] </tr>\W 任何不是ASCII符組成的的單詞,等同[^a-zA-Z0-9] </tr>\s 任何unicode空白字符 </tr>\S 任何非unicode空白符的字符,注意\W與\s不同 </tr>\d 任何ASCII數字等價于[0-9] </tr>\D 除了ASCII數字之外的任何字符,等價于[^0-9] </tr>[\b] 退格直接量(特例) </tr> </tbody> </table>-
例:
-
/[a,b,c]/:表示和字母"a","b","c"中的任意一個都匹配
</li> -
/[a-z]/:匹配拉丁字母表中的小寫字母
</li> -
/[/s/d]/:匹配任意空白符或數字
</li> </ul> </li> </ul>3. 重復
用以指定字符重復的標記
</blockquote>字 符 含 義 </tr> </tbody>{n,m} 匹配前一項至少n次,但不能超過m次 </tr>{n,} 匹配前一項n次或者更多次 </tr>{n} 匹配前一項n次 </tr>? 匹配前一項0次或者1次(也就是前一項是可選的,等價于{0,1}) </tr>+ 匹配前一項1次或者多次(等價于{1,}) </tr>* 匹配前一項0次或者多次,等價于{0,} </tr> </tbody> </table>-
例:
-
/\d{2,4}/:匹配2-4個數字。
</li> -
/\w[3]/d?/:精確匹配三個單詞和一個可選的數字。
</li> -
/\s+java\s+/:匹配前后有1個或多個空格的字符串"java"
</li> -
/[^(]*/:匹配0個或多個非左括號的字符(這里實際上能與"("匹配)
</li> </ul> </li> -
在使用"*",和"?"時要注意,由于這些字符能匹配0個字符,因此它們允許什么都不匹配,例:
-
/a*/能匹配字符串"bbbb",因其含有0個a。
</li> </ul> </li> -
上表中列出的匹配字符為"貪婪的"匹配,它總是盡可能多地匹配,且允許后續的正則表達式繼續匹配。
</li> -
非貪婪匹配,只需在待匹配的字符后跟隨一個問號即可,"?",+?,*?或{1,5}?。例:
-
/a+/:匹配"aaa"時,三個字符都被匹配,
</li> -
/a+?/:匹配"aaa"時,因其盡可能少的匹配,只能匹配第一個a
</li> </ul> </li> </ul>4.選擇-分組和引用
包括:指定選擇項,自表達式分組,和引用前一子表達式的特殊字符
</blockquote>-
選擇項的嘗試匹配次序是從左到右,直到發現匹配項,若左邊成功匹配就忽略右邊的項。
</li> -
正則表達式中圓括號的作用:
-
把單獨的項組成子表達式,以便于可以像處理獨立單元一樣,用\|,*,+或者?等等來對單元內的項進行處理
</li> -
在完整的模式中定義子模式
</li> -
允許在同一正則表達式的后部,引用前面的子表達式
</li> </ol> </li> </ul>字 符 含 義 </tr> </tbody>`"|" (這里是豎線)選擇,匹配的是該符號左邊的子表達式或右邊的子表達式 </tr>(...) 組合,將幾個項組合成為一個單元,這個單元可通過`\ ,*,+或者?`等符號,加以修飾,而且可以記住和這個相匹配的字符串以供以后的引用使用 </tr>(?:..) 只組合,把項組合到一個單元,但不記憶與該組相匹配的字符 </tr>\n 和第n個分組第一次匹配的字符相匹配,組是圓括號中的子表達式(也有可能嵌套的),組索引是從左到右的左括號數,"(?:形式的分組不編碼" </tr> </tbody> </table>-
例:
-
/ab|cd|ef/:可以匹配"ab",也可以匹配"cd",還可以匹配"ef".
</li> -
/\d{3}|[a-z]{4}/:可以匹配3個數字,或者4個小寫字母.
</li> -
(/[a-z]+(\d+)/):匹配一個或多個小寫字母后跟隨了一位或多位數字,使用括號包裹后,可以從檢索到的匹配中抽取數字了.
</li> </ul> </li> </ul>5.指定匹配位置
我們稱這些元素為正則表達式的錨,它們將模式定位在搜索字符串的特定位置上.
</blockquote>字 符 含 義 </tr> </tbody>^ 匹配字符串的開頭,在多行檢索中,匹配一行的開頭 </tr>$ 匹配字符串的結尾,在多行檢索中,匹配一行的結尾 </tr>\b 匹配一個單詞邊界,簡言之,就是位于字符\w和\W之間的位置,或位于字符\w和字符串的開頭或結尾之間的位置(需要注意:[\b]匹配的是退格符) </tr>\B 匹配非單詞邊界的位置 </tr> </tbody> </table>-
例:
-
/^JavaScript$/:匹配"JavaScript"單詞
</li> -
/\B[Ss]cript/:與"JavaScript"和"/postscript"匹配,但不與"script"與"Script".
</li> </ul> </li> </ul>6.修飾符
說明高級匹配的規則,放在"/"符號之外,第二條斜線后
</blockquote>字 符 含 義 </tr> </tbody>i 執行不區分大小寫的匹配 </tr>g 執行一個全局匹配,簡言之,就是要找到所有的匹配,而不是在找到一個之后就停止 </tr>m 多行匹配模式,^匹配一行的開頭和字符串的開頭,$匹配行的結束和字符串的結束 </tr> </tbody> </table>-
例:
-
/java$/im:可以匹配"java"也可以匹配"Java\nis fun"
</li> </ul> </li> </ul>用于模式匹配的string方法
正則表達式的作用就是用來解析字符串
</blockquote>1.search():
-
查找字符串,接受一個參數為正則表達式,返回返回一個與之匹配的子串的起始位置,若未找到返回-1.
</li> -
例:JavaScript.search(/script/i);//返回4
</li> -
search()方法不支持全局屬性檢索,所以會忽略修飾符g
</li> </ul>2.replace():
-
用以執行檢索與替換操作,接受兩個參數,第一個參數是一個正則,第二個是要進行替換的字符串
</li> -
若第一個參數是字符串,replace()則會直接搜索這個字符串
</li> -
若替換字符串中出現了$加數字,那么replace()將用與指定的子表達式相匹配的文本來替換這兩個字符.
</li> </ul>例:
text.replace(/javascript/gi,"JavaScript");//將所有不區分大小寫的javascript都替換成,大小寫正確的JavaScript.
//一段引用文本起始于引號,結束與引號. //中間的內容區域,不能包含引號 var quote = /"([^"]*)"/g; //引用中文半角引號替換英文引號,同時要保持引號之間的內容(儲存在$1中)沒有被修改. text.replace(quote,'“$1”');</pre>
3.match()
-
接受唯一一個參數,就是正則表達式,返回的是一個由匹配結果組成的數組.例:
-
"1 plus 2 equals 3".match(/\d+/g);//返回["1","2","3"]
</li> </ul> </li> -
若在這個正則表達式中沒有設置修飾符g,match()就不會進行全局檢索,它只檢索第一個匹配。但即使match()執行的不是全局檢索,它也返回一個數組。在這種情況下,數組的第一個元素就是匹配的字符串,余下的元素則是正則表達式中用圓括號括起來的子表達式。
</li> -
因此,如果macth()返回一個數組a,那么a[0]存放的是完整的匹配,a[1]存放的是與第一個圓括號括起來的表達式相匹配的子串,以此類推。為了和方法replace()保持以后,a[n]存放的是$n的內容。
</li> -
例:解析一個url
</li> </ul>var url = /(\w+):\/\/([\w.]+)\/(\S*)/; var text = "Visit my blog at
var result = text.match(url);
if (result != null) { var fullurl = result[0]; //包含 "4.split()
-
用以將調用它的字符串拆分為子串組成的數組,使用分隔符是split()的參數
</li> -
參數為字符串
-
"123,456,789".split(",");//返回["123","456","789"]
</li> </ul> </li> -
參數為正則
-
"1,2, 3,4 ,5".split(/\s*,\s*/)//返回["1","2"," 3","4 ","5"]
</li> -
指定分隔符",",允許兩邊可以留有任意多的空白符
</li> </ul> </li> </ul>RegExp對象
-
RegExp對象用以創建新的RegExp對象,可接受兩個參數,第二個可選.
</li> -
RegExp對象的第一個參數為正則表達式的主體部分,也就是/...../之間的文本,無論是字符串直接量,還是正則表達式都使用"\"作為轉義字符的前綴.
</li> -
第二個可選參數為指定正則表達式的修飾符,i,g,m或者他們的組合.參考:文本模式的則表達式-修飾符
</li> </ul>
例:var reg = new RegExp("\\d{5}","g");//匹配全局模式下的5個數字 alert(reg.test("1J2a35786"));//true alert(reg.test("1J2a356"));//false
RegExp屬性
屬性名 類型 含義 </tr> </tbody>source 只讀字符串 包含正則表達式的文本 </tr>global 只讀布爾值 用以說明正則表達式是否帶有修飾g </tr>ignoreCase 只讀布爾值 用以說明正則表達式是否帶有修飾i </tr>multiline 只讀布爾值 用以說明正則表達式是否帶有修飾m </tr>lastIndex 可讀性的整數 若匹配模式中含有g,這個屬性儲存在整個字符串中下一次檢索的開始位置 </tr> </tbody> </table>
來自:http://segmentfault.com/a/1190000003977848本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!sesese色
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-