iOS 正則表達式~詳解 01 (簡介)

//聯系人:石虎QQ: 1224614774昵稱:嗡嘛呢叭咪哄

一、正則表達式基本概念

1.什么是正則表達式 正則表達式,又稱正規表示法,是對字符串操作的一種邏輯公式。 正則表達式可以檢測 給定的字符串是否符合我們定義的邏輯,也可以從字符串中獲取我們想要的特定部分。它可以 迅速地用極簡單的方式達到字符串的復雜控制。

2.什么是謂詞 Cocoa框架中的NSPredicate用于查詢,原理和用法都類似于SQL中的where,作用相當于數據庫的過濾取。 我們可以編寫簡單的謂詞語句,就可以從數組中過濾出我們想要的數據。

二.正則表達式的使用

//正則表達式的使用

- (void)useRegularExpressions

{

#pragma mark 1.正則表達式規則

/*-------------------------------1.1普通字符-------------------------------*/

// 字母、數字、漢字、下劃線、非特殊定義的標點符號,都是"普通字符"。表達式中的普通字符,在匹配一個字符串的時候,匹配與之相同的一個字符。

NSString *searchString1_1 = @"abcde";

NSString *regexString1_1 = @"c";

NSString *matchedString1_1 = [searchString1_1 stringByMatching:regexString1_1];

NSLog(@"matchedString1_1:%@",matchedString1_1); // 輸出結果: c

/*-------------------------------1.2簡單的轉義字符-------------------------------*/

// 一些不便書寫的字符,在前面加 "\",如:\n,\t,\\ 等

NSString *searchString1_2 = @"abc$de";

// 記住在字符串中“\”需要用“\\”表示

NSString *regexString1_2 = @"\\$d";

NSString *matchedString1_2 = [searchString1_2 stringByMatching:regexString1_2];

NSLog(@"matchedString1_2:%@",matchedString1_2); // 輸出結果: $d

/*------------------------1.3能夠與 '多種字符' 匹配的表達式-------------------------*/

/*

. ? ? : 匹配除換行符以外的任意字符

\w? ? : 匹配字母或數字或下劃線或漢字

\s? ? : 匹配任意的空白符

\d? ? : 匹配數字

\b? ? : 匹配單詞的開始或結束

*/

NSString *searchString1_3 = @"abc123";

// 正則表達式有一條規則:最先開始的匹配擁有最高的優先權

NSString *regexString1_3 = @"\\d\\d";

NSString *matchedString1_3 = [searchString1_3 stringByMatching:regexString1_3];

NSLog(@"matchedString1_3:%@",matchedString1_3); // 輸出結果: 12

/*---------------------1.4自定義能夠匹配 '多種字符' 的表達式-------------------------*/

// 使用方括號 [ ] 包含一系列字符,能夠匹配其中任意一個字符。用 [^ ] 包含一系列字符,則能夠匹配其中字符之外的任意一個字符。同樣的道理,雖然可以匹配其中任意一個,但是只能是一個,不是多個。[]本身就隱含了“或”的關系,在[]中使用“|”表示“或”的關系是不對的,這樣做只是多了一個普通字符“|”,用來匹配“|”字符本身,()也是同樣道理。 如:

/*

[ab5@]? ? : 匹配 "a" 或 "b" 或 "5" 或 "@"

[^abc]? ? : 匹配 "a","b","c" 之外的任意一個字符

[f-k] ? ? : 匹配 "f"~"k" 之間的任意一個字母

[^A-F0-3] : 匹配 "A"~"F","0"~"3" 之外的任意一個字符

*/

NSString *searchString1_4 = @"abc123";

NSString *regexString1_4 = @"[bcd][bcd]";

NSString *matchedString1_4 = [searchString1_4 stringByMatching:regexString1_4];

NSLog(@"matchedString1_4:%@",matchedString1_4); // 輸出結果: bc

/*---------------------1.5修飾匹配次數的特殊符號------------------------------*/

// 使用表達式再加上修飾匹配次數的特殊符號,那么不用重復書寫表達式就可以重復匹配

/*

{n} ? :? 表達式重復n次

{m,n} :? 表達式至少重復m次,最多重復n次

{m,}? :? 表達式至少重復m次

? ? ? :? 匹配表達式0次或者1次,相當于 {0,1}

+ ? ? :? 表達式至少出現1次,相當于 {1,}

* ? ? :? 表達式不出現或出現任意次,相當于 {0,}

*/

NSString *searchString1_5 = @"It costs $12.5";

NSString *regexString1_5 = @"\\d+\\.?\\d";

NSString *matchedString1_5 = [searchString1_5 stringByMatching:regexString1_5];

NSLog(@"matchedString1_5:%@",matchedString1_5); // 輸出結果: 12.5

/*---------------------1.6其他一些代表抽象意義的特殊符號--------------------------*/

// 一些符號在表達式中代表抽象的特殊意義

/*

^ ? ? : 與字符串開始的地方匹配,不匹配任何字符

$ ? ? : 與字符串結束的地方匹配,不匹配任何字符

\b? ? : 匹配一個單詞邊界,也就是單詞和空格之間的位置,不匹配任何字符

*/

// 進一步說明:"\b" 與 "^" 和 "$" 類似,本身不匹配任何字符,但是它要求它在匹配結果中所處位置的左右兩邊,其中一邊是 "\w" 范圍,另一邊是 非"\w" 的范圍

NSString *searchString1_6 = @"@@@abc";

NSString *regexString1_6 = @".\\b.";

NSString *matchedString1_6 = [searchString1_6 stringByMatching:regexString1_6];

NSLog(@"matchedString1_6:%@",matchedString1_6); // 輸出結果: @a

#pragma mark 2.正則表達式中的一些高級規則

/*---------------------2.1匹配次數中的貪婪與非貪婪--------------------------*/

// 1)在使用修飾匹配次數的特殊符號"{m,n}", "{m,}", "?", "*", "+"可以使同一個表達式能夠匹配不同的次數,這種重復匹配不定次數的表達式在匹配過程中,總是盡可能多的匹配。如:

NSString *searchString2_1_1 = @"dxxxdxxxd";

NSString *regexString2_1_1 = @"(d)(\\w+)(d)";

NSString *matchedString2_1_1 = [searchString2_1_1 stringByMatching:regexString2_1_1];

NSLog(@"matchedString2_1_1:%@",matchedString2_1_1); // 輸出結果: dxxxdxxxd

// 2)在修飾匹配次數的特殊符號后再加上一個 "?" 號,則可以使匹配次數不定的表達式盡可能少的匹配,這種匹配原則叫作 "非貪婪" 模式,也叫作 "勉強" 模式

NSString *regexString2_1_2 = @"(d)(\\w+?)(d)";

NSString *matchedString2_1_2 = [searchString2_1_1 stringByMatching:regexString2_1_2];

NSLog(@"matchedString2_1_2:%@",matchedString2_1_2); // 輸出結果: dxxxd

/*---------------------2.2反向引用--------------------------------------*/

// 使用小括號指定一個子表達式后,匹配這個子表達式的文本(也就是此分組捕獲的內容)可以在表達式或其它程序中作進一步的處理。默認情況下,每個分組會自動擁有一個組號,規則是:從左向右,以分組的左括號為標志,第一個出現的分組的組號為1,第二個為2,以此類推

NSString *searchString2_2 = @"go go";

NSString *regexString2_2 = @"\\b(\\w+)\\b\\s+\\1\\b";

NSString *matchedString2_2 = [searchString2_2 stringByMatching:regexString2_2];

NSLog(@"matchedString2_2:%@",matchedString2_2); // 輸出結果: go go

/*----------------2.3零寬斷言-------------------------------------------*/

// 零寬斷言用于查找在某些內容(但并不包括這些內容)之前或之后的東西,也就是說它們像\b,^,$那樣用于指定一個位置,這個位置應該滿足一定的條件(即斷言),因此它們也被稱為零寬斷言

/*

1)捕獲

(exp) ? ? ? ? : 匹配exp,并捕獲文本到自動命名的組里

(?exp)? : 匹配exp,并捕獲文本到名稱為name的組里,也可以寫成(?'name'exp)

(?:exp) ? ? ? : 匹配exp,不捕獲匹配的文本,也不給此分組分配組號零寬斷言,可節約性能,提高效率

2)零寬斷言

(?=exp) ? ? ? : 匹配exp前面的位置

(?<=exp)? ? ? : 匹配exp后面的位置

(?!exp) ? ? ? : 匹配后面跟的不是exp的位置

(?

*/

NSString *searchString2_3 = @"I'm singing while you're dancing.";

NSString *regexString2_3 = @"\\b\\w+(?=ing\\b)";

NSArray *matchedString2_3 = [searchString2_3 componentsMatchedByRegex:regexString2_3];

NSLog(@"matchedString2_3:%@",matchedString2_3); // 輸出結果: (sing,danc)

// 3.其他通用規則

/*----------------3.1------------------------------------------*/

// 表達式中,可以使用 "\xXX" 和 "\uXXXX" 表示一個字符("X" 表示一個十六進制數)

/*

\xXX? ? : 編號在 0 ~ 255 范圍的字符,比如:空格可以使用 "\x20" 表示

\uXXXX? : 任何字符可以使用 "\u" 再加上其編號的4位十六進制數表示,比如:"\u4E2D"

*/

/*----------------3.2------------------------------------------*/

// 在表達式 "\s","\d","\w","\b" 表示特殊意義的同時,對應的大寫字母表示相反的意義

/*

\S ? ? : 匹配所有非空白字符("\s" 可匹配各個空白字符)

\D ? ? : 匹配所有的非數字字符

\W ? ? : 匹配所有的字母、數字、下劃線以外的字符

\B ? ? : 匹配非單詞邊界,即左右兩邊都是 "\w" 范圍或者左右兩邊都不是 "\w" 范圍時的字符縫隙

*/

/*----------------3.3------------------------------------------*/

// 在表達式中有特殊意義,需要添加 "\" 才能匹配該字符本身的字符匯總

/*

^ ? ? : 匹配輸入字符串的開始位置。要匹配 "^" 字符本身,請使用 "\^"

$ ? ? : 匹配輸入字符串的結尾位置。要匹配 "$" 字符本身,請使用 "\$"

( ) ? : 標記一個子表達式的開始和結束位置。要匹配小括號,請使用 "\(" 和 "\)"

[ ] ? : 用來自定義能夠匹配 '多種字符' 的表達式。要匹配中括號,請使用 "\[" 和 "\]"

{ } ? : 修飾匹配次數的符號。要匹配大括號,請使用 "\{" 和 "\}"

. ? ? : 匹配除了換行符(\n)以外的任意一個字符。要匹配小數點本身,請使用 "\."

? ? ? : 修飾匹配次數為 0 次或 1 次。要匹配 "?" 字符本身,請使用 "\?"

+ ? ? : 修飾匹配次數為至少 1 次。要匹配 "+" 字符本身,請使用 "\+"

* ? ? : 修飾匹配次數為 0 次或任意次。要匹配 "*" 字符本身,請使用 "\*"

| ? ? : 左右兩邊表達式之間 "或" 關系。匹配 "|" 本身,請使用 "\|"

" ? ? : 用在不帶@的字符串中時,用\"來進行轉義,用在帶@的字符串中時,用""來進行轉義

注意:大部分在正則中有特殊意義、在匹配其本身時需轉義的字符,在[]內是不需要轉義的。必須轉義的只有“\”、“[”和“]”,而“^”出現在[]開始位置,“-”前后構成范圍區間時,需要轉義,出現在其它位置不需要轉義,如:[\^ .$^{\[(|)*+?\\-]

*/

}

謝謝!!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容