標籤:分配 world 名稱 name 運算式 文法 one 是什麼 等等
首先簡單介紹下Regex:
在編寫處理字串的程式或網頁時,經常會有尋找符合某些複雜規則的字串的需要。Regex就是用於描述這些規則的工具。換句話說,Regex就是記錄文本規則的代碼。
下面就看看Regex裡亂七八糟的字元都是什麼意思:
1、常用的元字元
代碼 |
說明 |
. |
匹配除分行符號以外的任一字元 |
\w |
匹配字母或數字或底線或漢字 |
\s |
匹配任意的空白符 |
\d |
匹配數字 |
\b |
匹配單詞的開始或結束 |
^ |
匹配字串的開始 |
$ |
匹配字串的結束 |
那我們試著理解下:
\bhello\b 其實就是尋找單詞hello了——先是某個單詞開始處(\b),然後是字串hello,最後是單詞結束處(\b)。
010-\d\d\d\d\d\d\d\d 比如北京的固定電話——先是010-,然後是8個數字(\d)。
^\d{18}$ 比如社會安全號碼——先是字串開始(^),然後是18位元字(\d),最後字串結束($)。
2、常用的限定符
代碼 |
說明 |
* |
重複零次或更多次 |
+ |
重複一次或更多次 |
? |
重複零次或一次 |
{n} |
重複n次 |
{n, } |
重複n次或更多次 |
{n,m} |
重複n到m次 |
\ba\w*\b 匹配以字母a開頭的單詞——先是某個單詞開始處(\b),然後是字母a,然後是任意數量的字母或數字(\w*),最後是單詞結束處(\b)。
windows\d+ 匹配windows開頭後面是一位或多位元字的,windows7、windows10等等——\d+即匹配一次或多次數字。
010-\d{8} 也是匹配北京固定電話,跟上面010-\d\d\d\d\d\d\d\d是一個意思,這個更簡便——\d{8}就是連續匹配八次數位意思。
3、常用的反義代碼
代碼 |
說明 |
\W |
匹配任意非字母或數字或底線或漢字的字元 |
\S |
匹配任意非空白符的字元 |
\D |
匹配任意非數字字元 |
\B |
匹配非單詞開始或結束的地方 |
[^x] |
匹配除x以外的任一字元 |
[^aeiou] |
匹配除母音以外的任一字元 |
"s[^"]+" 匹配用引號括起來的以s開頭的字串。
4、常用分組文法
代碼 |
說明 |
(exp) |
匹配exp,並捕獲文本到自動命名的組裡 |
(?<name>exp) |
匹配exp,並捕獲文本到名稱為name的組裡,也可以寫成(?‘name‘exp) |
(?:exp) |
匹配exp,不捕獲匹配的文本,也不給此分組分配組號 |
(?=exp) |
匹配exp前面的位置 |
(?<=exp) |
匹配exp後面的位置 |
(?!exp) |
匹配後面跟的不是exp的位置 |
(?<!exp) |
匹配前面不是exp的位置 |
\b\w*h(?!e)\w*\b 這個相對複雜一點,但是藉助上面的表格,應該也能讀懂,下面詳細分析下——單詞開始(\b);然後跟零個或多個字母(\w*),因為是單詞嘛,就只能是字母啦;接著是字母h,後面接一個不是e的字元(?!e),然後又是零個或多個字母(\w*),直到單詞結束(\b)。那我們就清楚了,也就是找“含有h字母,但h後面不是e的單詞”,比如him、honey。而把諸如hello、help這樣的單詞排除。
5、懶惰限定符
代碼 |
說明 |
*? |
重複任意次,但儘可能少重複 |
+? |
重複1次或更多次,但儘可能少重複 |
?? |
重複0次或1次,但儘可能少重複 |
{n,m}? |
重複n到m次,但儘可能少重複 |
{n, }? |
重複n次以上,但儘可能少重複 |
當Regex中包含能接受重複的限定符時,通常的行為是匹配儘可能多的字元。例如:a.*b 它將會匹配最長的以a開始,以b結束的字串。如果用它來搜尋aabab的話,它會匹配整個字串aabab。這被稱為貪婪匹配;但是用 a.*?b 搜尋的話會匹配aab(第一到第三個字元)和ab(第四到第五個字元),這叫懶惰匹配。
6、常用的其他符號
代碼 |
說明 |
\. |
元字元轉義。.是元字元,你沒有辦法匹配它,因為會被理解成別的意思,這時你就得使用\來取消這些字元的特殊意義,即\.。同樣的,其他元字元像*?+等等都需要轉義。
|
[] |
字元集。例如[0-9]匹配數字0到9,等同於\d;[a-z]匹配小寫字母;[.?!]匹配標點符號.?! |
() |
分組。每個組自動擁有組號,從左向右,第一個出現的分組的組號為1,第二個為2,以此類推。(\d{1,3}\.){3}\d{1,3} 是一個簡單的IP地址匹配運算式——\d{1,3}匹配1到3位的數字,(\d{1,3}\.){3}匹配三位元字加上一個英文句號(這個整體也就是這個分組)重複3次,最後再加上一個一到三位的數字(\d{1,3})。\b(\w+)\b\s+\1\b 可以用來匹配重複的單詞,像go go——首先是一個單詞,這個單詞含有一個或多個字母\b(\w+)\b,該單詞會被捕獲到編號為1的分組中,然後是1個或多個空白符(\s+),最後是分組1中捕獲的內容(也就是前面匹配的那個單詞)(\1),單詞結束(\b)。 |
| |
分枝。^\d{17}(\d|[xX])$ 可用來驗證是否為社會安全號碼碼——字串開始(^),接著匹配17位元字(\d{17}),然後是個數字(\d)或者(|)字母x或X([xX]),字串結束($)。 |
//i |
一次匹配。正則表達字面量。舉例見下文。 |
//g |
全域匹配。正則表達字面量。 舉例見下文。 |
下面是//i和//g的用法,我們從一段代碼中加深理解:
1 <html> 2 <body> 3 4 <script type="text/javascript"> 5 6 var str="Welcome to Microsoft! "; 7 str=str + "We are proud to announce that Microsoft has "; 8 str=str + "one of the largest Web Developers sites in the world."; 9 document.write(str.replace(/Microsoft/i, "W3School"));10 11 </script>12 13 </body>14 </html>
上面的代碼呢,是想把字串中的Microsoft替換成W3School,當Regex為/Microsoft/i時,運行結果:Welcome to W3School! We are proud to announce thatMicrosoft has one of the largest Web Developers sites in the world. 可以看出只有第一個Microsoft被替換了,即一次匹配。
我們將Regex/Microsoft/i改為/Microsoft/g,結果就變為:Welcome to W3School! We are proud to announce that W3School has one of the largest Web Developers sites in the world. 也就是說全文凡是有Microsoft的地方都被替換成W3School,即全域匹配。
當然還有很多代碼沒有涉及到,但是很多Regex應該能看懂了,入門了後面的學習就相對簡單了。如果沒懂可能確實我講得不清楚。大家可以去搜尋相關更多文章,每個作者表達事情的方式都不一樣,你可以看看你能更快更好地接收誰的說法。
以上內容如果有誤,深表抱歉,也希望大家能及時指出,不吝賜教,謝謝。
轉載自:http://www.cnblogs.com/realcare/p/6028622.html
Regex快速入門【轉】