iOS 開發(fā)之正則匹配(案例詳解)

前言

許久未寫簡書了,今日寫寫自己多日遇到的正則表達(dá)式所踩過的坑

附錄

附上璞大大的正則表達(dá)式說明
iOS常用正則表達(dá)式

/**
 *  正則表達(dá)式簡單說明
 *  語法:
 .       匹配除換行符以外的任意字符
 \\w      匹配字母或數(shù)字或下劃線或漢字
 \\s      匹配任意的空白符
 \\d      匹配數(shù)字
 \\b      匹配單詞的開始或結(jié)束
 ^       匹配字符串的開始
 $       匹配字符串的結(jié)束
 *       重復(fù)零次或更多次
 +       重復(fù)一次或更多次
 ?       重復(fù)零次或一次
 {n}    重復(fù)n次
 {n,}   重復(fù)n次或更多次
 {n,m}  重復(fù)n到m次
 \\W      匹配任意不是字母,數(shù)字,下劃線,漢字的字符
 \\S      匹配任意不是空白符的字符
 \\D      匹配任意非數(shù)字的字符
 \\B      匹配不是單詞開頭或結(jié)束的位置
 [^x]   匹配除了x以外的任意字符
 [^aeiou]匹配除了aeiou這幾個(gè)字母以外的任意字符
 *?      重復(fù)任意次,但盡可能少重復(fù)
 +?      重復(fù)1次或更多次,但盡可能少重復(fù)
 ??      重復(fù)0次或1次,但盡可能少重復(fù)
 {n,m}?     重復(fù)n到m次,但盡可能少重復(fù)
 {n,}?  重復(fù)n次以上,但盡可能少重復(fù)
 \\a      報(bào)警字符(打印它的效果是電腦嘀一聲)
 \\b      通常是單詞分界位置,但如果在字符類里使用代表退格
 \\t      制表符,Tab
 \\r      回車
 \\v      豎向制表符
 \\f      換頁符
 \\n      換行符
 \\e      Escape
 \\0nn  ASCII代碼中八進(jìn)制代碼為nn的字符
 \\xnn  ASCII代碼中十六進(jìn)制代碼為nn的字符
 \\unnnn    Unicode代碼中十六進(jìn)制代碼為nnnn的字符
 \\cN   ASCII控制字符。比如\\cC代表Ctrl+C
 \\A      字符串開頭(類似^,但不受處理多行選項(xiàng)的影響)
 \\Z      字符串結(jié)尾或行尾(不受處理多行選項(xiàng)的影響)
 \\z      字符串結(jié)尾(類似$,但不受處理多行選項(xiàng)的影響)
 \\G      當(dāng)前搜索的開頭
 \\p{name}  Unicode中命名為name的字符類,例如\\p{IsGreek}
 (?>exp)    貪婪子表達(dá)式
 (?<x>-<y>exp)  平衡組
 (?im-nsx:exp)  在子表達(dá)式exp中改變處理選項(xiàng)
 (?im-nsx)       為表達(dá)式后面的部分改變處理選項(xiàng)
 (?(exp)yes|no)     把exp當(dāng)作零寬正向先行斷言,如果在這個(gè)位置能匹配,使用yes作為此組的表達(dá)式;否則使用no
 (?(exp)yes)    同上,只是使用空表達(dá)式作為no
 (?(name)yes|no) 如果命名為name的組捕獲到了內(nèi)容,使用yes作為表達(dá)式;否則使用no
 (?(name)yes)   同上,只是使用空表達(dá)式作為no
 
 捕獲
 (exp)               匹配exp,并捕獲文本到自動命名的組里
 (?<name>exp)        匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)
 (?:exp)             匹配exp,不捕獲匹配的文本,也不給此分組分配組號
 零寬斷言
 (?=exp)             匹配exp前面的位置
 (?<=exp)            匹配exp后面的位置
 (?!exp)             匹配后面跟的不是exp的位置
 (?<!exp)            匹配前面不是exp的位置
 注釋
 (?#comment)         這種類型的分組不對正則表達(dá)式的處理產(chǎn)生任何影響,用于提供注釋讓人閱讀
 */

案例解析

  • 匹配純字母0~無窮多個(gè)
@"[a-zA-Z]*";
  • 匹配純字母1~無窮多個(gè)
@"[a-zA-Z]+";
  • 匹配純數(shù)字1~無窮多個(gè)
@"[0-9]+";
  • 匹配字母數(shù)字特定個(gè)數(shù),比如為4個(gè)
@"[a-zA-Z0-9]{4}";
  • 匹配字母數(shù)字特定個(gè)數(shù),比如為4~9個(gè)
@"[a-zA-Z0-9]{4,9}";
  • 匹配所有空白符
@"[\\s]*";
  • 匹配非空字符
@"[\\S]*";
  • 匹配所有內(nèi)容
@"[\\s\\S]*";
  • 匹配單詞、數(shù)字、下劃線、空白字符若干個(gè)
@"[\\sa-zA-Z0-9_]*";
  • 匹配某個(gè)指定字符,如A
@"[A]{1}";
  • 匹配特定單詞,如:School
@"[S]{1}[c]{1}[h]{1}[o]{1}[o]{1}[l]{1}";
//或者如下,當(dāng)個(gè)數(shù)為1的時(shí)候可以省略
@"[S][c][h][o][o][l]";
//或者直接寫出
@"School";
  • 匹配除此字符之外的任意字符,如:}
@"[^\\}]*";
  • 匹配漢字
@"[\u4e00-\u9fa5]*;
  • 匹配特殊字符
@"[0-9a-zA-Z\u4e00-\u9fa5\\.\\*\\)\\(\\+\\$\\[\\?\\\\\\^\\{\\|\\]\\}%%%@\'\",?!?、-【】·!_——=:;;<>《》‘’“”!#~]+";

*釋義

@"[\\s]*[-\\+]{1}[a-zA-Z0-9_\\s\\*:\\(\\)]+[\\{;]";
(匹配0~多個(gè)空白符)+(匹配一個(gè)-或者+)+(匹配1個(gè)及以上的字母、數(shù)字、下劃線、空白符、星號符號、冒號、左小括號、右小括號)+(1個(gè)左大括號、分號)

注意:以上正則表達(dá)式中有特別含義的符號則需要用反斜杠來轉(zhuǎn)義,但是iOS中需要對反斜杠再次轉(zhuǎn)義,所以會看到雙斜杠

測試工具

在線正則表達(dá)式測試

以上?。?!

問題探討

如何排除掉字符串呢?例如我要匹配非abc字符串的所有內(nèi)容,并不是非a|b|c字符的所有內(nèi)容,是匹配整個(gè)串,若有知道的可以留言~
參考:
利用正則表達(dá)式排除特定字符串
正則表達(dá)式匹配非需要匹配的字符串(標(biāo)題自己都繞暈了)
正則表達(dá)式匹配"非",以及"非"字符串的匹配

呆萌.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容