Regex是什嗎?
在編寫處理字串的程式或網頁時,經常會有尋找符合某些複雜規則的字串的需要。Regex就是用於描述這些規則的工具,也就是對文字進行模糊比對的語言。可以完成以下功能:
1)測試字串的某個模式;2)替換文本;3)根據匹配模式才能夠字串中提取子字串。
元字元“?”與“)”
?表示緊靠前的選項可有可無,例:abc能匹配ab和abc
)表示子匹配,例:a(bc)?能匹配a和abc。
11111-1234匹配模式“\d{5}(-\d{4})?",連續匹配兩個相同數字用\d)\1,連續匹配五個相同數字\d)\1{4};1221匹配模式(\d)(\d)\2\1。
\d表示匹配任意一個數字字元,{5}表示緊靠其前的元素項重複五次
字元轉義
如果你想尋找元字元本身的話,比如你尋找.,或者*,就出現了問題:你沒辦法指定它們,因為它們會被解釋成別的意思。這時你就得使用\來取消這些字元的特殊意義。因此,你應該使用\.和\*。當然,要尋找\本身,你也得用\\
例如:unibetter\.com匹配unibetter.com,C:\\Windows匹配C:\Windows。
RegExp顯示函數:newRegExp=("pattern"[,"flags"]);
RegExp隱示函數:/pattern/[flags].
"\"是逸出字元,構建顯示函數RegExp執行個體對象時,將"\"替換為"\\"。例:varre1=newRegExp=("\\d{5});等價於varre2=/\d{5}/;
元字元分類
一、限定符
{n}重複n次,例:o{2}不能與bob中o匹配,可以與food或foooood中兩個或連續兩個匹配。
{n,}重複n次或更多次,最少出現n次
{n,m}重複n到m次,至少n次,至多m次
+必須出現一次或連續多次,等效於{1,}
*出現連續多次或零次,"zo*"與"z"和"zoo"都能匹配,等效於{0,}
?最多出現一次,等效於{0,1}
650) this.width=650;" title="2013-09-15_202121.jpg" alt="202147699.jpg" src="http://img1.51cto.com/attachment/201309/202147699.jpg" />
貪婪匹配與非貪婪匹配
預設情況下Regex使用最長相符原則,即貪婪匹配。例:“zoom”匹配“zo?”的部分換為“r”,結果是“rom”,匹配“zo*”替換成“r”,結果是“rm”,而不是“room”。
當字元“?”緊跟其他限定符之後,匹配模式變為最短原則。例:“fooood”中,“fo+?”匹配的是“fo”,而“fo+”匹配“foooo”部分。
650) this.width=650;" title="1111.jpg" alt="204710464.jpg" src="http://img1.51cto.com/attachment/201309/204710464.jpg" />
選擇匹配符
“|”例:chapter|section1匹配的是“chapter”“section1”,chapter|section)1匹配“chapter1”“section1”。
二、分組組合與反向引用符
分組組合
將運算式中某部分內容組合起來的符號。pattern)將pattern部分組合成一個可統一操作的組合項和子匹配,若要匹配字面意義上的括弧字元“”和“)”,在Regex中要分別使用“\(”和
“\)”。
(\d{1,3}\.){3}\d{1,3}是一個簡單的IP地址匹配運算式。要理解這個運算式,請按下列順序分析它:\d{1,3}匹配1到3位的數字,(\d{1,3}\.){3}匹配三位元字加上一個英文句號(這個整體也就是這個分組)重複3次,最後再加上一個一到三位的數字(\d{1,3})。IP地址中每個數字都不能大於255,所以只能使用冗長的分組,選擇,字元類來描述一個正確的IP地址:((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)。
反向引用
用於匹配分組組合捕獲到的內容的標識符。\num匹配編號為num的緩衝區所儲存的內容,這種方式為子匹配的反向引用,能提供表示相同匹配項的能力。例:匹配連續五個數字字元。\d{5},可以匹配12345,若是55555,需要使用\d)\1{4}。匹配“itisthecostofofgasolinegoingupup?"中連續重複的單詞部分,用/\b([a-z]+)\1\b/gi。其中\b用於匹配單詞的邊界。
非捕獲匹配
?:pattern)將pattern部分組合成一個可統一操作的組合項,但不把這部分當子匹配項捕獲,匹配的內容不存在緩衝區內供以後使用。適用於必須進行組合但又不想讓組合部分具有子匹配特點情況。
例:(?:abc)?,"industry|industries"不能改寫成industry(ylies),如不需要引用或檢索括弧中運算式所匹配結果,寫為industry(?:ylies)。
正向“預測先行”匹配
(?=pattern),被搜尋的字串中必須有pattern部分匹配的內容,但不作為匹配結果處理,也不會存在緩衝區中。例:windows(?=NT|2000)只與windows2000或windowsNT中的windows匹配,而不與windows2003中的windows匹配。該匹配結果只是windows部分。
反向“預測先行”匹配
(?!pattern),被搜尋字串中不能有pattern部分匹配的內容,功能同上。例:windows(?!NT|2000)不與windows2000或windowsNT中的windows匹配,而與windows2003中的windows匹配。
本文出自 “yuhuifei” 部落格,請務必保留此出處http://4745272.blog.51cto.com/4735272/1297460