lua 模式匹配


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)匹配以空白符間隔的數字(再次強調,不包括這些空白符)。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM