1.元字符
前兩次用到的關於字符串中去掉<color=#FFFFFF></color> 用到的模糊匹配是
Result = string.gsub(str,"<color.->",",");
<color.-> 指任意到">"的字符
. 匹配除換行符以外的任意字符
/w 匹配字母或數字或下划線或漢字
/s 匹配任意的空白符
/d 匹配數字
/b 匹配單詞的開始或結束
^ 匹配字符串的開始
$ 匹配字符串的結束
2.
/b 代表着單詞的開頭或結尾,也就是單詞的分界處.如果要精確地查找hi這個單詞的話,我們應該使用/bhi/b.
.是另一個元字符,匹配除了換行符以外的任意字符,*同樣是元字符,它指定*前邊的內容可以重復任意次以使整個表達式得到匹配。
.-匹配到某一個字符
.*連在一起就意味着任意數量的不包含換行的字符。
/d是一個新的元字符,匹配任意的數字,0/d/d-/d/d/d/d/d/d/d/d也就是中國的電話號碼.為了避免那么多煩人的重復,我們也可以這樣寫這個表達式:0/d{2}-/d{8}。
/s匹配任意的空白符,包括空格,制表符(Tab),換行符,中文全角空格等。/w匹配字母或數字或下划線或漢字。
/b/w{6}/b 匹配剛好6個字母/數字的單詞。
3.重復
* 重復零次或更多次
+ 重復一次或更多次
? 重復零次或一次
{n} 重復n次
{n,} 重復n次或更多次
{n,m} 重復n到m次
要想查找數字,字母或數字,你只需要在中括號里列出它們就行了,像[aeiou]就匹配任何一個元音字母,[.?!]匹配標點符號(.或?或!)
4.反義
/W 匹配任意不是字母,數字,下划線,漢字的字符
/S 匹配任意不是空白符的字符
/D 匹配任意非數字的字符
/B 匹配不是單詞開頭或結束的位置
[^x] 匹配除了x以外的任意字符
[^aeiou] 匹配除了aeiou這幾個字母以外的任意字符
5替換:
正則表達式里的替換指的是有幾種規則,如果滿足其中任意一種規則都應該當成匹配,具體方法是用|把不同的規則分隔開。
0/d{2}-/d{8}|0/d{3}-/d{7}這個表達式能匹配兩種以連字號分隔的電話號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。
/(0/d{2}/)[- ]?/d{8}|0/d{2}[- ]?/d{8}這個表達式匹配3位區號的電話號碼,其中區號可以用小括號括起來,也可以不用,區號與本地號間可以用連字號或空格間隔,也可以沒有間隔。你 可以試試用替換|把這個表達式擴展成也支持4位區號的。
6
分組:
如果想要重復一個字符串又該怎么辦?你可以用小括號來指定子表達式(也叫做分組),然后你就可以指定這個子表達式的重復次數了。
(/d{1,3}/.){3}/d{1,3}是一個簡單的IP地址匹配表達式。要理解這個表達式,請按下列順序分析它:/d{1,3}匹配1到3位的數 字,(/d{1,3}/.}{3}匹配三位數字加上一個英文句號(這個整體也就是這個分組)重復3次,最后再加上一個一到三位的數字(/d{1,3})。 不幸的是,它也將匹配256.300.888.999這種不可能存在的IP地址(IP地址中每個數字都不能大於255)。如果能使用算術比較的話,或許能 簡單地解決這個問題,但是正則表達式中並不提供關於數學的任何功能,所以只能使用冗長的分組,選擇,字符類來描述一個正確的IP地址: ((2[0-4]/d|25[0-5]|[01]?/d/d?)/.){3}(2[0-4]/d|25[0-5]|[01]?/d/d?)。
2[0-4]/d 指第一位為2,第二位為0-4之間的數,第三位為任意數字
25[0-5] 指第一二位為25,第三位為0-5
[01]?/d/d 指第一位為0,1中的任意數重復零次為一次,第二三位任意
7
后向引用:
后向引用用於重復搜索前面某個分組匹配的文本。例如,/1代表分組1匹配的文本。難以理解?請看示例:
/b(/w+)/b/s+/1/b可以用來匹配重復的單詞,像go go, kitty kitty。首先是一個單詞,也就是單詞開始處和結束處之間的多於一個的字母或數字(/b(/w+)/b),然后是1個或幾個空白符(/s+,最后是前面匹配的那個單詞(/1)。
8懶惰限定符
*? 重復任意次,但盡可能少重復
+? 重復1次或更多次,但盡可能少重復
?? 重復0次或1次,但盡可能少重復
{n,m}? 重復n到m次,但盡可能少重復
{n,}? 重復n次以上,但盡可能少重復
9
位置指定:
接下來的四個用於查找在某些內容(但並不包括這些內容)之前或之后的東西,也就是說它們用於指定一個位置,就像/b,^,$那樣,因此它們也被稱為零寬斷言。最好還是拿例子來說明吧:
(?=exp)也叫零寬先行斷言,它匹配文本中的某些位置,這些位置的后面能匹配給定的后綴exp。比如/b/w+(?=ing/b),匹配以 ing結尾的單詞的前面部分(除了ing以外的部分),如果在查找I'm singing while you're dancing.時,它會匹配sing和danc。
(?<=exp)也叫零寬后行斷言,它匹配文本中的某些位置,這些位置的前面能給定的前綴匹配exp。比如(?<=/bre)/w+/b會匹配以re開頭的單詞的后半部分(除了re以外的部分),例如在查找reading a book時,它匹配ading。
假如你想要給一個很長的數字中每三位間加一個逗號(當然是從右邊加起了),你可以這樣查找需要在前面和里面添加逗號的部分:((?<=/d)/d{3})*/b。請仔細分析這個表達式,它可能不像你第一眼看出來的那么簡單。
下面這個例子同時使用了前綴和后綴:(?<=/s)/d+(?=/s)匹配以空白符間隔的數字(再次強調,不包括這些空白符)。