iOS 中的正則匹配(工具類)

来源:http://www.cnblogs.com/arvin-sir/archive/2016/01/03/5097391.html
-Advertisement-
Play Games

正則表達式正則表達式是對字元串操作的一種邏輯公式, 用事先定義好的一些特定字元、及這些特定字元的組合, 組成一個"規則字元串",這個"規則字元串"用來表達對字元串的一種過濾邏輯,正則表達式就是用於描述這些規則的工具,或者說, 正則表達式就是記錄文本規則的代碼.在開發中, 我們經常會有查找符合某些複雜...


正則表達式

正則表達式是對字元串操作的一種邏輯公式, 用事先定義好的一些特定字元、及這些特定字元的組合, 組成一個"規則字元串",

這個"規則字元串"用來表達對字元串的一種過濾邏輯, 正則表達式就是用於描述這些規則的工具, 或者說, 正則表達式就是記錄文本規則的代碼.

在開發中, 我們經常會有查找符合某些複雜規則的字元串的需要,

比如數據校驗: 判斷用戶的輸入是否合法(如:用戶註冊的時候,QQ號碼,電話號碼,郵箱是否符合要求) 

下麵讓我們先來看看正則匹配常用的一些字元:

一. 常用通配符

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

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

\s    匹配任意的空白符(空格,tab\t,回車\r \n)

\d    匹配數字

^     匹配字元串的開始

$     匹配字元串的結束

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

二. 常用反義通配符

\W      匹配任意不是字母,數字,下劃線,漢字的字元

\S       匹配任意不是空白符的字元

\D       匹配任意非數字的字元

\B       匹配不是單詞開頭或結束的位置

[^x]    匹配除了x以外的任意字元

[^aeiou]  匹配除了aeiou這幾個字母以外的任意字元

三. 集合

[xyz]     匹配xyz中任意的字元

[^xyz]  匹配不是xyz中的任意字元

[a-z]     匹配從小寫字母a到小寫字母z之間的任意字元

[^a-z]   匹配非從小寫字母a到小寫字母z之間的任意字元

四. 常用限定符

*      重覆零次或更多次

+     重覆一次或更多次

?      重覆零次或一次

{n}  重覆n次

{n,} 重覆n次或更多次

{n,m} 重覆n到m次

五. 貪婪和懶惰模式(預設是貪婪模式;在量詞後面直接加上問號,就是非貪婪模式)

*?          重覆任意次,但儘可能少重覆

+?         重覆一次或更多次,但儘可能少重覆

??          重覆零次或一次,但儘可能少重覆

{n,m}?  重覆n到m次,但儘可能少重覆

{n,}?     重覆n次以上,但儘可能少重覆

 

以上就是正則表達式的匹配規則需要使用到的字元.

下麵是我在開發中時常用到的和平時收集的一些正則匹配,為了後續方便,所以整理下封裝成一個工具類,提供類方法來調用,返回匹配結果.

或許上面的匹配字元有些朋友看不太明白,那就不說廢話了,上代碼,多看幾次,然後自己嘗試著去寫,很快就可以明白了.

- RegularTool.h

 1 //
 2 //  RegularTool.h
 3 //  正則匹配
 4 //
 5 //  Created by Arvin on 15/12/3.
 6 //  Copyright © 2015年 Arvin. All rights reserved.
 7 //
 8 
 9 #import <Foundation/Foundation.h>
10 
11 typedef void(^resultBlock)(NSString *res);
12 
13 @interface RegularTool: NSObject
14 
15 /*!
16  *  匹配固定電話號碼
17  *
18  *  @param number 需要匹配的固話號碼
19  *
20  *  @return 返回匹配結果
21  */
22 + (NSString *)matchTelephoneNumber:(NSString *)number;
23 
24 /*!
25  *  匹配手機號碼
26  *
27  *  @param number 需要匹配的手機號碼
28  *
29  *  @return 返回匹配結果
30  */
31 + (NSString *)matchMobilephoneNumber:(NSString *)number;
32 
33 /*!
34  *  匹配3-15位的中文或英文(用戶名)
35  *
36  *  @param username 需要匹配的字元串
37  *
38  *  @return 返回匹配結果
39  */
40 + (NSString *)matchUsername:(NSString *)username;
41 
42 /*!
43  *  匹配6-18位的數字和字母組合(密碼)
44  *
45  *  @param password 需要匹配的字元串
46  *
47  *  @return 返回匹配結果
48  */
49 + (NSString *)matchPassword:(NSString *)password;
50 
51 /*!
52  *  匹配郵箱帳號
53  *
54  *  @param email 需要匹配的郵箱帳號
55  *
56  *  @return 返回匹配結果
57  */
58 + (NSString *)matchEmail:(NSString *)email;
59 
60 /*!
61  *  匹配身份證號碼
62  *
63  *  @param idCard 需要匹配的身份證號碼
64  *
65  *  @return 返回匹配結果
66  */
67 + (NSString *)matchUserIdCard:(NSString *)idCard;
68 
69 /*!
70  *  匹配URL字元串
71  *
72  *  @param urlStr 需要匹配的URL字元串
73  *
74  *  @return 返回匹配結果
75  */
76 + (NSString *)matchURLStr:(NSString *)urlStr;
77 
78 /*!
79  *  匹配¥:價格字元串
80  *
81  *  @param priceStr 包含價格的字元串
82  *
83  *  @return 返回匹配結果
84  */
85 + (BOOL)matchPriceStr:(NSString *)priceStr;
86 
87 @end

- RegularTool.m

  1 //
  2 //  RegularTool.m
  3 //  正則匹配
  4 //
  5 //  Created by Arvin on 15/12/3.
  6 //  Copyright © 2015年 Arvin. All rights reserved.
  7 //
  8 
  9 #import "RegularTool.h"
 10 
 11 @implementation RegularTool
 12 
 13 #pragma mark - 匹配固定電話號碼
 14 + (NSString *)matchTelephoneNumber:(NSString *)number {
 15     NSString *pattern = @"^(\\d{3,4}-)\\d{7,8}$";
 16     __block NSString *result;
 17     [RegularTool matchString:number withPattern:pattern resultBlock:^(NSString *res) {
 18         result = res;
 19     }];
 20     return result;
 21 }
 22 
 23 #pragma mark - 匹配手機號碼
 24 + (NSString *)matchMobilephoneNumber:(NSString *)number {
 25     NSString *pattern = @"^(0|86)?1([358][0-9]|7[678]|4[57])\\d{8}$";
 26     __block NSString *result;
 27     [RegularTool matchString:number withPattern:pattern resultBlock:^(NSString *res) {
 28         result = res;
 29     }];
 30     return result;
 31 }
 32 
 33 #pragma mark - 匹配3-15位的中文或英文(用戶名)
 34 + (NSString *)matchUsername:(NSString *)username {
 35     NSString *pattern = @"^[a-zA-Z一-龥]{3,15}$";
 36     __block NSString *result;
 37     [RegularTool matchString:username withPattern:pattern resultBlock:^(NSString *res) {
 38         result = res;
 39     }];
 40     return result;
 41 }
 42 
 43 #pragma mark - 匹配6-18位的數字和字母組合(密碼)
 44 + (NSString *)matchPassword:(NSString *)password {
 45     NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}$";
 46     __block NSString *result;
 47     [RegularTool matchString: password withPattern: pattern resultBlock:^(NSString *res) {
 48         result = res;
 49     }];
 50     return result;
 51 }
 52 
 53 #pragma mark - 匹配郵箱帳號
 54 + (NSString *)matchEmail:(NSString *)email {
 55     NSString *pattern =
 56     @"^[a-z0-9]+([\\._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+\\.){1,63}[a-z0-9]+$";
 57     __block NSString *result;
 58     [RegularTool matchString:email withPattern:pattern resultBlock:^(NSString *res) {
 59         result = res;
 60     }];
 61     return result;
 62 }
 63 
 64 #pragma mark - 匹配身份證號碼
 65 + (NSString *)matchUserIdCard:(NSString *)idCard {
 66     NSString *pattern =
 67     @"(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)";
 68     __block NSString *result;
 69     [RegularTool matchString:idCard withPattern:pattern resultBlock:^(NSString *res) {
 70         result = res;
 71     }];
 72     return result;
 73 }
 74 
 75 #pragma mark - 匹配URL字元串
 76 + (NSString *)matchURLStr:(NSString *)urlStr {
 77     NSString *pattern = @"^[0-9A-Za-z]{1,50}$";
 78     __block NSString *result;
 79     [RegularTool matchString:urlStr withPattern: pattern resultBlock:^(NSString *res) {
 80         result = res;
 81     }];
 82     return result;
 83 }
 84 
 85 #pragma mark - 匹配¥:價格字元串
 86 + (BOOL)matchPriceStr:(NSString *)priceStr {
 87     NSError *error = nil;
 88     NSString *pattern = @"¥(\\d+(?:\\.\\d+)?)";
 89     NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:pattern options: 1 << 0 error: &error];
 90     if (!error) {
 91         NSArray<NSTextCheckingResult *> *result = [regular matchesInString:priceStr options:NSMatchingWithoutAnchoringBounds range:NSMakeRange(0, priceStr.length)];
 92         if (result) {
 93             for (NSTextCheckingResult *checkingRes in result) {
 94                 if (checkingRes.range.location == NSNotFound) {
 95                     continue;
 96                 }
 97                 NSLog(@"%@",[priceStr substringWithRange:checkingRes.range]);
 98                 //NSLog(@"%@",[priceStr substringWithRange:[res rangeAtIndex:1]]);
 99             }
100         }
101         return YES;
102     }
103     NSLog(@"匹配失敗,Error: %@",error);
104     return NO;
105 }
106 
107 
108 /*!
109  *  正則匹配
110  *
111  *  @param str     匹配的字元串
112  *  @param pattern 匹配規則
113  *
114  *  @return 返回匹配結果
115  */
116 + (BOOL)matchString:(NSString *)str withPattern:(NSString *)pattern resultBlock:(resultBlock)block {
117     NSError *error = nil;
118     NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern: pattern options: NSRegularExpressionCaseInsensitive error: &error];
119     if (!error) {
120         NSTextCheckingResult *result = [regular firstMatchInString:str options:0 range:NSMakeRange(0, str.length)];
121         if (result) {
122             NSLog(@"匹配成功");
123             block([str substringWithRange:result.range]);
124             return YES;
125         } else {
126             NSLog(@"匹配失敗");
127             return NO;
128         }
129     }
130     NSLog(@"匹配失敗,Error: %@",error);
131     return NO;
132 }
133 
134 @end

END! 歡迎留言交流,一起學習...


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 相比於java調用MySqlApI來操作資料庫,調用Mongo要簡潔容易的多。通過一個簡單的樣例,很容易地就可以上手一、導入Jar包添加Monog支持Java的jar包,這裡使用的是2.9.3 org.mongodb mongo-java-driver 2.9.3二、一個簡單的樣例// 連接到...
  • SQLPlus 在連接時通常有三種方式1. sqlplus / as sysdba操作系統認證,不需要資料庫伺服器啟動listener,也不需要資料庫伺服器處於可用狀態。比如我們想要啟動資料庫就可以用這種方式進入sqlplus,然後通過startup命令來啟動。2. sqlplus username...
  • 想要在C#中使用MongoDB,首先得要有個MongoDB支持的C#版的驅動。C#版的驅動有很多種,如官方提供的,samus。 實現思路大都類似。這裡我們先用官方提供的mongo-csharp-driver ,當前版本為1.7.0.4714下載地址:http://github.com/mongodb...
  • 一、基礎操作1、命令mongo2、插入db.表名.insert({“屬性”:”值”})3、查找全部db.表名.find()4、根據條件查找db.表名.find({“name”:”value”})5、更新 update({查找條件},{更新後屬性值})6、刪除 remove({查找條件})7、查看1條...
  • Redis 配置Redis 的配置文件位於 Redis 安裝目錄下,文件名為 redis.conf。你可以通過 CONFIG 命令查看或設置配置項。語法3>Redis CONFIG 命令格式如下:redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME...
  • 步驟1,打開“Generate and Publish Objects”嚮導。右鍵點擊要導出數據的資料庫,選擇Taks->GenerateScript 步驟2,選擇要導出數據的表。在上一步的彈窗視窗中選擇Next跳過“Introduction”,之後進入“Choose Objects”界面。 預設的...
  • 上一篇隨筆,已經成功開啟了Redis-server,客戶端已經可以正常對redis進行正常操作。但是,redis-server開啟的同時,一個大大doc黑屏也在那裡開啟著,接下來就對講解如何在Linux系統下讓redis-server後臺運行(相當於windows系統下以後臺服務運行)(1)打開re...
  • 最近項目要使用Redis,特將這段時間將Redis的學習經驗與大家分享,算是對這段時間學習成果的總結和技術提煉,不足之處還望大家批評指正。項目背景:有些很少改動的數據和經常使用的數據(例如系統中下拉列表數據),系統需要頻繁的與SqlServer資料庫進行數據交互,大大的增加了伺服器和SqlServe...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...