正則表達式Regular Expression

1,正則表達式的基本使用:

//1.1,創(chuàng)建一個正則表達式對象:定義規(guī)則
NSString *pattern = @"[0-9]";
NSRegularExpression *regularExp = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];

//1.2誓斥,利用對象進行判斷(test是你要從中查找的字符串)
NSArray *results = [regularExp matchesInString:test options:0 range:NSMakeRange(0, test.length)];

//2,輸出結(jié)果毕谴,注意遍歷的時候里面的子類是:NSTextCheckingResultfor 
for (NSTextCheckingResult *result in results) { 
    NSLog(@"%@,%@",NSStringFromRange(result.range),[test substringWithRange:result.range]);
}

2距芬,正則表達式的規(guī)則:

  • 2.1框仔,查找指定的對象(比如“張”字):
    NSString *pattern = @"張";//直接寫在里面

  • 2.2,查找指定對象中的任何一個:

  • 注意??:數(shù)字可以簡化用\d表示银舱,oc中需要轉(zhuǎn)義跛梗,即用\\d表示

  • 任意一個數(shù)字:
    NSString *pattern = @"[1234567890]";
    //@"[1234567890]"也可以簡化成@"[0-9]"茄袖,中括號代表查找內(nèi)部內(nèi)容的任何一個
    NSString *pattern = @"[0-9]";
    NSString *pattern = @"\\d";

  • 比如說任何一個小寫字母:
    NSString *pattern = @"[a-z]";

  • 比如說任何一個字母:
    NSString *pattern = @"[a-zA-Z]";

  • 比如說任何一個字母或者數(shù)字:
    NSString *pattern = @"[a-zA-Z0-9]";

  • 比如說“張三毛”三個字中的其中任何一個:
    NSString *pattern = @"[張三毛]";//中括號代表查找內(nèi)部內(nèi)容的任何一個

  • 2.3,查找指定對象中同類型連續(xù)的:

  • 比如說有多少個兩個數(shù)字一起的:
    NSString *pattern = @"[0-9][0-9]"聂薪;//NSString *test = @"1234567890"蝗羊,test中輸出結(jié)果是5耀找,因為有5對
    NSString *pattern = @"\d\d";//這種方式還可以用大括號簡化业崖,如兩個連在一起的數(shù)字双炕,用@“\d{2}”表示

  • 比如說有多少個五個個數(shù)字一起的:
    NSString *pattern = @"\\d{5}";

  • 比如說三個數(shù)字兩個字母a連在一起:
    NSString *pattern = @"\\d{3}a{2}";

  • 比如說2-4個數(shù)字連在一起的:
    NSString *pattern = @"\\d{2-4}";//1234輸出結(jié)果為1妇斤,12345輸出結(jié)果為1站超,123456輸出結(jié)果為2死相!

  • 2.4算撮,特殊字符在正則中的作用

  • 钮惠? :0個或者1個// @"k58k789"結(jié)果為8七芭,@"k58"結(jié)果為4狸驳,@"k5"結(jié)果為3

  • * : 0個或者多個// @"k58k789"結(jié)果為5撰糠,@"k58"結(jié)果為3辩昆,@"k5"結(jié)果為3

  • + : 至少一個(一般用+比較多)// @"k58k789"結(jié)果為2,@"k58"結(jié)果為1术辐,@"k5"結(jié)果為1

  • ^ : 匹配字符串的開始
    NSString *pattern = @"^\\d"http://字符串必須以數(shù)字開頭,@"1k5dd324"結(jié)果為1
    NSString *pattern = @"^\\d{3}"http://字符串必須以3個數(shù)字開頭猾骡,@"1k5dd324"結(jié)果為0幢哨,@"231k5dd324"結(jié)果為1

  • $ : 匹配字符串的結(jié)束
    NSString *pattern = @"\\d$"http://字符串必須以數(shù)字結(jié)束狮含,@"1k5dd324"結(jié)果為1
    NSString *pattern = @"\\d{3}$"http://字符串必須以3個數(shù)字結(jié)束蔚龙,@"1k5dd324"結(jié)果為1

  • 2.5木羹,查找以數(shù)字開頭并以數(shù)字結(jié)尾:

  • NSString *pattern = @"^\\d[0-9a-zA-Z]*\\d$";//*星號不可以省略抛人,這行還可以簡化如下

  • NSString *pattern = @"^\\d.*\\d$";//.代表任何字符妖枚, .*代表任意零個或者多個字符

3,正則表達式幾種常見應(yīng)用場景:

  • 3.1,正則判斷是否是QQ號碼:
  • 5-11位數(shù)字
  • 非0開頭
NSString *pattern = @"^[1-9]\\d{4,10}$";
  • 3.2续誉,正則判斷是否是手機號碼:
  • 11位數(shù)字
  • 13/15/17/183開頭
NSString *pattern = @"^1[3578]\\d{9}$";
  • 3.3, 正則判斷是否是IP地址:
    1-3個數(shù)字-1-3個數(shù)字-1-3個數(shù)字-1-3個數(shù)字
NSString *pattern = @“((?:(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(?:25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d))))”;
  • 3.4, 正則匹配中文:
NSString *pattern = @"[\\u4e00-\\u9fa5]";
  • 3.5, 正則匹配url:
NSString *pattern = @"(http|ftp|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?";

4,取出正則表達式中匹配的內(nèi)容并解析:

NSString *test = @"jack13412rosee3323fdf543589dkkd";

//1,正則表達式的使用:
//1.1,創(chuàng)建一個正則表達式對象:定義規(guī)則
NSString *pattern = @"[a-zA-Z]+";
NSRegularExpression *regularExp = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];
//1.2盒发,利用對象進行判斷
NSArray *results = [regularExp matchesInString:test options:0 range:NSMakeRange(0, test.length)];

//2拼卵,輸出結(jié)果蛮艰,注意遍歷的時候里面的子類是:NSTextCheckingResult
for (NSTextCheckingResult *result in results) {
    NSLog(@"%@,%@",NSStringFromRange(result.range),[test substringWithRange:result.range]);
}

5,匹配#袜刷,@和[]內(nèi)容

//即將到來的秀恩愛高峰期[拜拜]@搞笑補習(xí)班即將到來的秀恩愛高峰期[拜拜]
NSString *test = @"即[abvc]將到來的秀恩愛高峰期[拜拜]@搞笑補習(xí)班:即將到http://c.biancheng.net/cpp/html/1435.html 來的秀恩愛高峰期[拜拜]#hahahaha# http://c.biancheng.net/cpp/html/1435.html";

  • 匹配[]內(nèi)容
//1,正則表達式的使用:
//1.1,創(chuàng)建一個正則表達式對象:定義規(guī)則
NSString *pattern = @"\\[[a-zA-Z\\u4e00-\\u9fa5]+\\]";
NSRegularExpression *regularExp = [[NSRegularExpression alloc] initWithPattern:pattern options:0 error:nil];

//1.2奸披,利用對象進行判斷
NSArray *results = [regularExp matchesInString:test options:0 range:NSMakeRange(0, test.length)];

for (NSTextCheckingResult *result in results) {
    NSLog(@"--000%@,%@",NSStringFromRange(result.range),[test substringWithRange:result.range]);
}
  • 匹配#內(nèi)容
//1,正則表達式的使用:
//1.1,創(chuàng)建一個正則表達式對象:定義規(guī)則
NSString *pattern01 = @"\\#[a-zA-Z\\u4e00-\\u9fa5]+\\#";
NSRegularExpression *regularExp01 = [[NSRegularExpression alloc] initWithPattern:pattern01 options:0 error:nil];

//1.2,利用對象進行判斷
NSArray *results01 = [regularExp01 matchesInString:test options:0 range:NSMakeRange(0, test.length)];

for (NSTextCheckingResult *result in results01) {
    NSLog(@"--001%@,%@",NSStringFromRange(result.range),[test substringWithRange:result.range]);
}
  • 匹配@內(nèi)容
//1颂斜,正則表達式的使用:
//1.1,創(chuàng)建一個正則表達式對象:定義規(guī)則
NSString *pattern02 = @"\\@[0-9A-Za-z\\u4e00-\\u9fa5]+";
NSRegularExpression *regularExp02 = [[NSRegularExpression alloc] initWithPattern:pattern02 options:0 error:nil];

//1.2,利用對象進行判斷
NSArray *results02 = [regularExp02 matchesInString:test options:0 range:NSMakeRange(0, test.length)];

for (NSTextCheckingResult *result in results02) {
    NSLog(@"--002%@,%@",NSStringFromRange(result.range),[test substringWithRange:result.range]);
}
  • 匹配url內(nèi)容
//1,正則表達式的使用:
//1.1,創(chuàng)建一個正則表達式對象:定義規(guī)則
NSString *pattern03 = @"(http|ftp|https):\\/\\/[\\w\\-_]+(\\.[\\w\\-_]+)+([\\w\\-\\.,@?^=%&:/~\\+#]*[\\w\\-\\@?^=%&/~\\+#])?";
NSRegularExpression *regularExp03 = [[NSRegularExpression alloc] initWithPattern:pattern03 options:0 error:nil];

//1.2,利用對象進行判斷
NSArray *results03 = [regularExp03 matchesInString:test options:0 range:NSMakeRange(0, test.length)];

for (NSTextCheckingResult *result in results03) {
    NSLog(@"--002%@,%@",NSStringFromRange(result.range),[test substringWithRange:result.range]);
}

6同木,第三方框架RegexKitLite:

  • 6.1彤路,使用??:
  • 1,改為MRC模式:-fno-objc-arc
Snip20170111_19.png
  • 2,需要添加動態(tài)庫: libicucore.dylib

  • Snip20170111_20.png
  • 6.2,使用方法:

  • 6.2.1检眯,正向查找普通方法:

  • 查找特殊字符

NSString *str = @"即[][abvc]將到來的#秀恩愛#高峰期[拜拜]@搞笑補習(xí)班:即將到http://c.biancheng.net/cpp/html/1435.html 來的秀恩愛高峰期[拜拜]#hahahaha# http://c.biancheng.net/cpp/html/1435.html";
//找出表情內(nèi)容锰瘸,如[拜拜]
NSString *emoPattern = @"\\[[a-zA-Z\\u4e00-\\u9fa5]+\\]";
NSArray *enoResults = [str componentsMatchedByRegex:emoPattern];
NSLog(@"表情內(nèi)容是---%@",enoResults);
//找出@內(nèi)容,如@搞笑補習(xí)班
NSString *atPattern = @"\\@[a-zA-Z\\u4e00-\\u9fa5]+";
NSArray *atResults = [str componentsMatchedByRegex:atPattern];
NSLog(@"@內(nèi)容是---%@",atResults);
//找出@話題內(nèi)容倒脓,如#秀恩愛#
NSString *topicPattern = @"\\#[a-zA-Z\\u4e00-\\u9fa5]+\\#";
NSArray *topicArray = [str componentsMatchedByRegex:topicPattern];
NSLog(@"熱門話題的內(nèi)容是---%@",topicArray);
  • 6.2.2,正向查找高級方法:
    • 查找特殊字符高級
NSString *str = @"即[][abvc]將到來的#秀恩愛#高峰期[拜拜]@搞笑補習(xí)班:即將到http://c.biancheng.net/cpp/html/1435.html 來的秀恩愛高峰期[拜拜dd]#hahahaha# http://c.biancheng.net/cpp/html/1435.html";
//找出表情內(nèi)容饲做,如[拜拜]
NSString *emoPattern = @"\\[[a-zA-Z\\u4e00-\\u9fa5]+\\]";
//找出@內(nèi)容盆均,如@搞笑補習(xí)班
NSString *atPattern = @"\\@[a-zA-Z\\u4e00-\\u9fa5]+";
//找出@話題內(nèi)容,如#秀恩愛#
NSString *topicPattern = @"\\#[a-zA-Z\\u4e00-\\u9fa5]+\\#";
//這里直接把三個查找的對象合并一下一下子全部輸出了就不在一一輸出了
NSString *pattern = [NSString stringWithFormat:@"%@|%@|%@",emoPattern, atPattern,topicPattern];
[str enumerateStringsMatchedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
    NSLog(@"range:%@, str:%@",NSStringFromRange(*capturedRanges), *capturedStrings);
}];
  • 6.2.2,反向查找方法:
    • 跟正向查找相反唇敞,查找特殊字符以外的所有其他字符
NSString *str = @"即[][abvc]將到來的#秀恩愛#高峰期[拜拜]@搞笑補習(xí)班:即將到http://c.biancheng.net/cpp/html/1435.html 來的秀恩愛高峰期[拜拜dd]#hahahaha# http://c.biancheng.net/cpp/html/1435.html";
//找出表情內(nèi)容,如[拜拜]
NSString *emoPattern = @"\\[[a-zA-Z\\u4e00-\\u9fa5]+\\]";
//找出@內(nèi)容模叙,如@搞笑補習(xí)班
NSString *atPattern = @"\\@[a-zA-Z\\u4e00-\\u9fa5]+";
//找出@話題內(nèi)容,如#秀恩愛#
NSString *topicPattern = @"\\#[a-zA-Z\\u4e00-\\u9fa5]+\\#";
//這里直接把三個查找的對象合并一下一下子全部輸出了就不在一一輸出了渠啊,只有這里的方法和正向查找不同替蛉,注意分辨
NSString *pattern = [NSString stringWithFormat:@"%@|%@|%@",emoPattern, atPattern,topicPattern];
[str enumerateStringsSeparatedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
    NSLog(@"range:%@, str:%@",NSStringFromRange(*capturedRanges), *capturedStrings);
}];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镣煮,一起剝皮案震驚了整個濱河市怎静,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌夜牡,老刑警劉巖塘装,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異阴幌,居然都是意外死亡,警方通過查閱死者的電腦和手機懒闷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門速址,熙熙樓的掌柜王于貴愁眉苦臉地迎上來壳繁,“玉大人闹炉,你說我怎么就攤上這事渣触⌒嶙辏” “怎么了店展?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柳弄。 經(jīng)常有香客問我概说,道長嚣伐,這世上最難降的妖魔是什么萍丐? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任逝变,我火速辦了婚禮,結(jié)果婚禮上耿导,老公的妹妹穿的比我還像新娘舱呻。我一直安慰自己悠汽,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布茬高。 她就那樣靜靜地躺著怎栽,像睡著了一般宿饱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上强饮,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天为黎,我揣著相機與錄音,去河邊找鬼剪廉。 笑死炕檩,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的吹泡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼洞难,長吁一口氣:“原來是場噩夢啊……” “哼揭朝!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柱嫌,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤编丘,失蹤者是張志新(化名)和其女友劉穎彤悔,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抑片,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡杨赤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年疾牲,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡盔沫,死狀恐怖枫匾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谴忧,我是刑警寧澤,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布委造,位于F島的核電站均驶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏妇穴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一跑筝、第九天 我趴在偏房一處隱蔽的房頂上張望瞒滴。 院中可真熱鬧,春花似錦逛腿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽境蜕。三九已至,卻和暖如春粱年,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背完箩。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工弊知, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留粱快,地道東北人叔扼。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓漫雷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親食呻。 傳聞我的和親對象是個殘疾皇子澎现,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

推薦閱讀更多精彩內(nèi)容