iOS 正则表达式使用的三种方式语法
生活随笔
收集整理的這篇文章主要介紹了
iOS 正则表达式使用的三种方式语法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、正則表達式定義
?? 四、速記理解技巧 1、’.’?, ?‘[ ]’,?‘^’ ,?‘$’ 是基礎的正則表達式,所有語言都支持。正則難理解是因為里面有一個等價的概念,增加了理解難度。 2、等價:同樣的功能,用不同符號來書寫 ?,*,+,\d,\w 都是等價字符
?等價于匹配長度{0,1}
*等價于匹配長度{0,}?
+等價于匹配長度{1,}
\d等價于[0-9] \D等價于[^0-9]
\w等價于[A-Za-z_0-9] \W等價于[^A-Za-z_0-9]。 3、常用運算符與表達式: ^ 開始
() 域段
[] 包含,默認是一個字符長度
[^] 不包含,默認是一個字符長度
{n,m} 匹配長度?
. 任何單個字符(\. 字符點)
| 或
\ 轉義
$ 結尾
[A-Z] 26個大寫字母
[a-z] 26個小寫字母
[0-9] 0至9數字 [A-Za-z0-9] 26個大寫字母、26個小寫字母和0至9數字
, 分割
. 4、分割語法: [A,H,T,W] 包含A或H或T或W字母 [a,h,t,w] 包含a或h或t或w字母 [0,3,6,8] 包含0或3或6或8數字 5、語法與釋義: 基礎語法 "^([]{})([]{})([]{})$" 正則字符串 = "開始([包含內容]{長度})([包含內容]{長度})([包含內容]{長度})結束"? ?,*,+,\d,\w 這些都是簡寫的,完全可以用[]和{}代替,在(?:)(?=)(?!)(?<=)(?<!)(?i)(*?)(+?)這種特殊組合情況下除外。 初學者可以忽略?,*,+,\d,\w一些簡寫標示符,學會了基礎使用再按表自己去等價替換 6?、iOS 中使用正則表達式有三種方式 /** 方式一:使用謂詞 */- (void)regexUsePredicateWithText:(UITextField *)cardTextField {/** Visa */NSString *visaRegex = @"^4\\d{15}$";NSPredicate *visaPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", visaRegex];/** Maestro */NSString *maestroRegex = @"^(50|(5[6-9])|(6[\\d]))\\d{10,17}$";NSPredicate *maestroPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", maestroRegex];/** MasterCard */NSString *masterCardRegex = @"^(5[1-5][\\d]{2}|222[1-9]|22[3-9][\\d]|2[3-6][\\d]{2}|27[0-1][\\d]|2720)\\d{12}$";NSPredicate *masterCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", masterCardRegex];/** American Express */NSString *americanExpRegex = @"^(3(4|7))\\d{10,16}$";NSPredicate *americanExpPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", americanExpRegex];/** Diners Club International */NSString *dinersRegex = @"^((30(9|[0-5])|((36|38|39)\\d)))\\d{5,15}$";NSPredicate *dinersPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", dinersRegex];if ([visaPredicate evaluateWithObject:cardTextField.text]) {NSLog(@"已經匹配到Visa卡");} else if ([maestroPredicate evaluateWithObject:cardTextField.text]) {NSLog(@"已經匹配到Maestro卡");} else if ([masterCardPredicate evaluateWithObject:cardTextField.text]) {NSLog(@"已經匹配到Maestro卡");} else if ([americanExpPredicate evaluateWithObject:cardTextField.text]) {NSLog(@"已經匹配到American Express卡");} else if ([dinersPredicate evaluateWithObject:cardTextField.text]) {NSLog(@"已經匹配到Diners Club International卡");} else {NSLog(@"沒有匹配到信用卡");}}/** 方式二:使用rangeOfString:option:直接查找 *//** Visa */NSString *visaRegex = @"^4\\d{15}$";NSRange range = [theTextField.text rangeOfString:visaRegex options:NSRegularExpressionSearch];if (range.location != NSNotFound) {NSLog(@"已經匹配到Visa卡");} else {NSLog(@"沒有匹配到信用卡");}/** 方式三:使用正則表達式類 */NSError *error = NULL;NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:visaRegex options:NSRegularExpressionCaseInsensitive error:&error];NSTextCheckingResult *result = [regex firstMatchInString:theTextField.text options:0 range:NSMakeRange(0, [theTextField.text length])];if (result) {NSLog(@"已經匹配到Visa卡");} else {NSLog(@"沒有匹配到信用卡");}- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {/** 只允許輸入 空格 數字 小括號() */NSPredicate *visaPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"^(\\s|[\\d()-])+$"];if ([visaPredicate evaluateWithObject:string]) {return YES;} else {return NO;} } 7、實例: 字符串;tel:086-0666-88810009999 原始正則:"^tel:[0-9]{1,3}-[0][0-9]{2,3}-[0-9]{8,11}$"? 速記理解:開始 "tel:普通文本"[0-9數字]{1至3位}"-普通文本"[0數字][0-9數字]{2至3位}"-普通文本"[0-9數字]{8至11位} 結束" 等價簡寫后正則寫法:"^tel:\d{1,3}-[0]\d{2,3}-\d{8,11}$" ,簡寫語法不是所有語言都支持。 1.驗證用戶名和密碼:("^[a-zA-Z]\w{5,15}$")正確格式:"[A-Z][a-z]_[0-9]"組成,并且第一個字必須為字母6~16位; 2.驗證電話號碼:("^(\d{3,4}-)\d{7,8}$")正確格式:xxx/xxxx-xxxxxxx/xxxxxxxx; 3.驗證手機號碼:"^1[3|4|5|7|8][0-9]\\d{8}$"; 4.驗證身份證號(15位或18位數字):"\d{14}[[0-9],0-9xX]"; 5.驗證Email地址:("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"); 6.只能輸入由數字和26個英文字母組成的字符串:("^[A-Za-z0-9]+$"); 7.整數或者小數:^[0-9]+([.][0-9]+){0,1}$ 8.只能輸入數字:"^[0-9]*$"。 9.只能輸入n位的數字:"^\d{n}$"。 10.只能輸入至少n位的數字:"^\d{n,}$"。 11.只能輸入m~n位的數字:"^\d{m,n}$"。 12.只能輸入零和非零開頭的數字:"^(0|[1-9][0-9]*)$"。 13.只能輸入有兩位小數的正實數:"^[0-9]+(\.[0-9]{2})?$"。 14.只能輸入有1~3位小數的正實數:"^[0-9]+(\.[0-9]{1,3})?$"。 15.只能輸入非零的正整數:"^\+?[1-9][0-9]*$"。 16.只能輸入非零的負整數:"^\-[1-9][0-9]*$"。 17.只能輸入長度為3的字符:"^.{3}$"。 18.只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"。 19.只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"。 20.只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"。 21.驗證是否含有^%&',;=?$\"等字符:"[%&',;=?$\\^]+"。 22.只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"。 23.驗證URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。 24.驗證一年的12個月:"^(0?[1-9]|1[0-2])$"正確格式為:"01"~"09"和"10"~"12"。 25.驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式為;"01"~"09"、"10"~"29"和“30”~“31”。 26.獲取日期正則表達式:\\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日? 評注:可用來匹配大多數年月日信息。 27.匹配雙字節字符(包括漢字在內):[^\x00-\xff] 評注:可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1) 28.匹配空白行的正則表達式:\n\s*\r 評注:可以用來刪除空白行 29.匹配HTML標記的正則表達式:<(\S*?)[^>]*>.*?</>|<.*? /> 評注:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對于復雜的嵌套標記依舊無能為力 30.匹配首尾空白字符的正則表達式:^\s*|\s*$ 評注:可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達式 31.匹配網址URL的正則表達式:[a-zA-z]+://[^\s]* 評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求 32.匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 評注:表單驗證時很實用 33.匹配騰訊QQ號:[1-9][0-9]{4,} 評注:騰訊QQ號從10 000 開始 34.匹配中國郵政編碼:[1-9]\\d{5}(?!\d) 評注:中國郵政編碼為6位數字 35.匹配ip地址:([1-9]{1,3}\.){3}[1-9]。 評注:提取ip地址時有用 36.匹配MAC地址:([A-Fa-f0-9]{2}\:){5}[A-Fa-f0-9]
- 正則表達式:又稱規則表達式(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE,是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。
- 靈活性、邏輯性和功能性非常的強
- 可以迅速地用極簡單的方式達到字符串的復雜控制
- 對于剛接觸的人來說,比較晦澀難懂。?
- 選擇
- | 豎直分隔符代表選擇。例如“gray|grey”可以匹配grey或gray。
- 數量限定
- 某個字符后的數量限定符用來限定前面這個字符允許出現的個數。最常見的數量限定符包括“+”、“?”和“*”(不加數量限定則代表出現一次且僅出現一次):
- + 加號代表前面的字符必須至少出現一次。(1次、或多次)。例如,“goo+gle”可以匹配google、gooogle、goooogle等;
- ?問號代表前面的字符最多只可以出現一次。(0次、或1次)。例如,“colou?r”可以匹配color或者colour;
- * 星號代表前面的字符可以不出現,也可以出現一次或者多次。(0次、或1次、或多次)。例如,“0*42”可以匹配42、042、0042、00042等。
- 匹配
- 圓括號可以用來定義操作符的范圍和優先度。例如,“gr(a|e)y”等價于“gray|grey”,“(grand)?father”匹配father和grandfather。
- 上述這些構造子都可以自由組合,因此,“H(ae?|?)ndel”和“H(a|ae|?)ndel”是相同的。
- 表達式全集
| 字符 | 描述 |
| \ | 將下一個字符標記為一個特殊字符(File Format Escape)、或一個原義字符(Identity Escape)、或一個向后引用(backreferences)、或一個八進制轉義符。例如,“n”匹配字符“n”?!癨n”匹配一個換行符。序列“\\”匹配“\”而“\(”則匹配“(”。 |
| ^ | 匹配輸入字符串的開始位置。如果設置了RegExp對象的Multiline屬性,^也匹配“\n”或“\r”之后的位置。 |
| $ | 匹配輸入字符串的結束位置。如果設置了RegExp對象的Multiline屬性,$也匹配“\n”或“\r”之前的位置。 |
| * | 匹配前面的子表達式零次或多次。例如,zo*能匹配“z”、“zo”以及“zoo”。*等價于{0,}。 |
| + | 匹配前面的子表達式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等價于{1,}。 |
| ? | 匹配前面的子表達式零次或一次。例如,“do(es)?”可以匹配“do”或“does”中的“do”。?等價于{0,1}。 |
| {n} | n是一個非負整數。匹配確定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的兩個o。 |
| {n,} | n是一個非負整數。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等價于“o+”。“o{0,}”則等價于“o*”。 |
| {n,m} | m和n均為非負整數,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”將匹配“fooooood”中的前三個o?!皁{0,1}”等價于“o?”。請注意在逗號和兩個數之間不能有空格。 |
| ? | 非貪心量化(Non-greedy quantifiers):當該字符緊跟在任何一個其他重復修飾符(*,+,?,{n},{n,},{n,m})后面時,匹配模式是非貪婪的。非貪婪模式盡可能少的匹配所搜索的字符串,而默認的貪婪模式則盡可能多的匹配所搜索的字符串。例如,對于字符串“oooo”,“o+?”將匹配單個“o”,而“o+”將匹配所有“o”。 |
| . | 匹配除“\n”之外的任何單個字符。要匹配包括“\n”在內的任何字符,請使用像“(.|\n)”的模式。 |
| (pattern) | 匹配pattern并獲取這一匹配的子字符串。該子字符串用于向后引用。所獲取的匹配可以從產生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中則使用$0…$9屬性。要匹配圓括號字符,請使用“\(”或“\)”。 |
| (?:pattern) | 匹配pattern但不獲取匹配的子字符串(shy groups),也就是說這是一個非獲取匹配,不存儲匹配的子字符串用于向后引用。這在使用或字符“(|)”來組合一個模式的各個部分是很有用。例如“industr(?:y|ies)”就是一個比“industry|industries”更簡略的表達式。 |
| (?=pattern) | 正向肯定預查(look ahead positive assert),在任何匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始。 |
| (?!pattern) | 正向否定預查(negative assert),在任何不匹配pattern的字符串開始處匹配查找字符串。這是一個非獲取匹配,也就是說,該匹配不需要獲取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。預查不消耗字符,也就是說,在一個匹配發生后,在最后一次匹配之后立即開始下一次匹配的搜索,而不是從包含預查的字符之后開始 |
| (?<=pattern) | 反向(look behind)肯定預查,與正向肯定預查類似,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。 |
| (?<!pattern) | 反向否定預查,與正向否定預查類似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。 |
| x|y | 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(?:z|f)ood”則匹配“zood”或“food”。 |
| [xyz] | 字符集合(character class)。匹配所包含的任意一個字符。例如,“[abc]”可以匹配“plain”中的“a”。特殊字符僅有反斜線\保持特殊含義,用于轉義字符。其它特殊字符如星號、加號、各種括號等均作為普通字符。脫字符^如果出現在首位則表示負值字符集合;如果出現在字符串中間就僅作為普通字符。連字符 - 如果出現在字符串中間表示字符范圍描述;如果如果出現在首位則僅作為普通字符。 |
| [^xyz] | 排除型字符集合(negated character classes)。匹配未列出的任意字符。例如,“[^abc]”可以匹配“plain”中的“plan”。 |
| [a-z] | 字符范圍。匹配指定范圍內的任意字符。例如,“[a-z]”可以匹配“a”到“z”范圍內的任意小寫字母字符。 |
| [^a-z] | 排除型的字符范圍。匹配任何不在指定范圍內的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范圍內的任意字符。 |
| [:name:] | 增加命名字符類(named character class)[注 1]中的字符到表達式。只能用于方括號表達式。 |
| [=elt=] | 增加當前locale下排序(collate)等價于字符“elt”的元素。例如,[=a=]可能會增加?、á、à、?、?、?、?、?、a、?、?、?、?、ǎ、?、?、?、?、?、?、?、?、ā、?、?、?、?、?、?、?、?、?、?、ɑ 。只能用于方括號表達式。 |
| [.elt.] | 增加排序元素(collation element)elt到表達式中。這是因為某些排序元素由多個字符組成。例如,29個字母表的西班牙語, "CH"作為單個字母排在字母C之后,因此會產生如此排序“cinco, credo, chispa”。只能用于方括號表達式。 |
| \b | 匹配一個單詞邊界,也就是指單詞和空格間的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。 |
| \B | 匹配非單詞邊界?!癳r\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。 |
| \cx | 匹配由x指明的控制字符。例如,\cM匹配一個Control-M或回車符。x的值必須為A-Z或a-z之一。否則,將c視為一個原義的“c”字符。 |
| \d | 匹配一個數字字符。等價于[0-9]。 |
| \D | 匹配一個非數字字符。等價于[^0-9]。 |
| \f | 匹配一個換頁符。等價于\x0c和\cL。 |
| \n | 匹配一個換行符。等價于\x0a和\cJ。 |
| \r | 匹配一個回車符。等價于\x0d和\cM。 |
| \s | 匹配任何空白字符,包括空格、制表符、換頁符等等。等價于[ \f\n\r\t\v]。 |
| \S | 匹配任何非空白字符。等價于[^ \f\n\r\t\v]。 |
| \t | 匹配一個制表符。等價于\x09和\cI。 |
| \v | 匹配一個垂直制表符。等價于\x0b和\cK。 |
| \w | 匹配包括下劃線的任何單詞字符。等價于“[A-Za-z0-9_]”。 |
| \W | 匹配任何非單詞字符。等價于“[^A-Za-z0-9_]”。 |
| \ck | 匹配控制轉義字符。k代表一個字符。等價于“Ctrl-k”。用于ECMA語法。 |
| \xnn | 十六進制轉義字符序列。匹配兩個十六進制數字nn表示的字符。例如,“\x41”匹配“A”?!癨x041”則等價于“\x04&1”。正則表達式中可以使用ASCII編碼。. |
| \num | 向后引用(back-reference)一個子字符串(substring),該子字符串與正則表達式的第num個用括號圍起來的捕捉群(capture group)子表達式(subexpression)匹配。其中num是從1開始的十進制正整數,其上限可能是9[注 2]、31、[注 3]99甚至無限。[注 4]例如:“(.)\1”匹配兩個連續的相同字符。 |
| \n | 標識一個八進制轉義值或一個向后引用。如果\n之前至少n個獲取的子表達式,則n為向后引用。否則,如果n為八進制數字(0-7),則n為一個八進制轉義值。 |
| \nm | 3位八進制數字,標識一個八進制轉義值或一個向后引用。如果\nm之前至少有nm個獲得子表達式,則nm為向后引用。如果\nm之前至少有n個獲取,則n為一個后跟文字m的向后引用。如果前面的條件都不滿足,若n和m均為八進制數字(0-7),則\nm將匹配八進制轉義值nm。 |
| \nml | 如果n為八進制數字(0-3),且m和l均為八進制數字(0-7),則匹配八進制轉義值nml。 |
| \un | Unicode轉義字符序列。其中n是一個用四個十六進制數字表示的Unicode字符。例如,\u00A9匹配版權符號(?)。? |
?
- 優先權
| 最高 | \ |
| 高 | ( )、(?: )、(?= )、[ ] |
| 中 | *、+、?、{n}、{n,}、{m,n} |
| 低 | ^、$、中介字符 |
| 最低 | |? |
?等價于匹配長度{0,1}
*等價于匹配長度{0,}?
+等價于匹配長度{1,}
\d等價于[0-9] \D等價于[^0-9]
\w等價于[A-Za-z_0-9] \W等價于[^A-Za-z_0-9]。 3、常用運算符與表達式: ^ 開始
() 域段
[] 包含,默認是一個字符長度
[^] 不包含,默認是一個字符長度
{n,m} 匹配長度?
. 任何單個字符(\. 字符點)
| 或
\ 轉義
$ 結尾
[A-Z] 26個大寫字母
[a-z] 26個小寫字母
[0-9] 0至9數字 [A-Za-z0-9] 26個大寫字母、26個小寫字母和0至9數字
, 分割
. 4、分割語法: [A,H,T,W] 包含A或H或T或W字母 [a,h,t,w] 包含a或h或t或w字母 [0,3,6,8] 包含0或3或6或8數字 5、語法與釋義: 基礎語法 "^([]{})([]{})([]{})$" 正則字符串 = "開始([包含內容]{長度})([包含內容]{長度})([包含內容]{長度})結束"? ?,*,+,\d,\w 這些都是簡寫的,完全可以用[]和{}代替,在(?:)(?=)(?!)(?<=)(?<!)(?i)(*?)(+?)這種特殊組合情況下除外。 初學者可以忽略?,*,+,\d,\w一些簡寫標示符,學會了基礎使用再按表自己去等價替換 6?、iOS 中使用正則表達式有三種方式 /** 方式一:使用謂詞 */- (void)regexUsePredicateWithText:(UITextField *)cardTextField {/** Visa */NSString *visaRegex = @"^4\\d{15}$";NSPredicate *visaPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", visaRegex];/** Maestro */NSString *maestroRegex = @"^(50|(5[6-9])|(6[\\d]))\\d{10,17}$";NSPredicate *maestroPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", maestroRegex];/** MasterCard */NSString *masterCardRegex = @"^(5[1-5][\\d]{2}|222[1-9]|22[3-9][\\d]|2[3-6][\\d]{2}|27[0-1][\\d]|2720)\\d{12}$";NSPredicate *masterCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", masterCardRegex];/** American Express */NSString *americanExpRegex = @"^(3(4|7))\\d{10,16}$";NSPredicate *americanExpPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", americanExpRegex];/** Diners Club International */NSString *dinersRegex = @"^((30(9|[0-5])|((36|38|39)\\d)))\\d{5,15}$";NSPredicate *dinersPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", dinersRegex];if ([visaPredicate evaluateWithObject:cardTextField.text]) {NSLog(@"已經匹配到Visa卡");} else if ([maestroPredicate evaluateWithObject:cardTextField.text]) {NSLog(@"已經匹配到Maestro卡");} else if ([masterCardPredicate evaluateWithObject:cardTextField.text]) {NSLog(@"已經匹配到Maestro卡");} else if ([americanExpPredicate evaluateWithObject:cardTextField.text]) {NSLog(@"已經匹配到American Express卡");} else if ([dinersPredicate evaluateWithObject:cardTextField.text]) {NSLog(@"已經匹配到Diners Club International卡");} else {NSLog(@"沒有匹配到信用卡");}}/** 方式二:使用rangeOfString:option:直接查找 *//** Visa */NSString *visaRegex = @"^4\\d{15}$";NSRange range = [theTextField.text rangeOfString:visaRegex options:NSRegularExpressionSearch];if (range.location != NSNotFound) {NSLog(@"已經匹配到Visa卡");} else {NSLog(@"沒有匹配到信用卡");}/** 方式三:使用正則表達式類 */NSError *error = NULL;NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:visaRegex options:NSRegularExpressionCaseInsensitive error:&error];NSTextCheckingResult *result = [regex firstMatchInString:theTextField.text options:0 range:NSMakeRange(0, [theTextField.text length])];if (result) {NSLog(@"已經匹配到Visa卡");} else {NSLog(@"沒有匹配到信用卡");}- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {/** 只允許輸入 空格 數字 小括號() */NSPredicate *visaPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", @"^(\\s|[\\d()-])+$"];if ([visaPredicate evaluateWithObject:string]) {return YES;} else {return NO;} } 7、實例: 字符串;tel:086-0666-88810009999 原始正則:"^tel:[0-9]{1,3}-[0][0-9]{2,3}-[0-9]{8,11}$"? 速記理解:開始 "tel:普通文本"[0-9數字]{1至3位}"-普通文本"[0數字][0-9數字]{2至3位}"-普通文本"[0-9數字]{8至11位} 結束" 等價簡寫后正則寫法:"^tel:\d{1,3}-[0]\d{2,3}-\d{8,11}$" ,簡寫語法不是所有語言都支持。 1.驗證用戶名和密碼:("^[a-zA-Z]\w{5,15}$")正確格式:"[A-Z][a-z]_[0-9]"組成,并且第一個字必須為字母6~16位; 2.驗證電話號碼:("^(\d{3,4}-)\d{7,8}$")正確格式:xxx/xxxx-xxxxxxx/xxxxxxxx; 3.驗證手機號碼:"^1[3|4|5|7|8][0-9]\\d{8}$"; 4.驗證身份證號(15位或18位數字):"\d{14}[[0-9],0-9xX]"; 5.驗證Email地址:("^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$"); 6.只能輸入由數字和26個英文字母組成的字符串:("^[A-Za-z0-9]+$"); 7.整數或者小數:^[0-9]+([.][0-9]+){0,1}$ 8.只能輸入數字:"^[0-9]*$"。 9.只能輸入n位的數字:"^\d{n}$"。 10.只能輸入至少n位的數字:"^\d{n,}$"。 11.只能輸入m~n位的數字:"^\d{m,n}$"。 12.只能輸入零和非零開頭的數字:"^(0|[1-9][0-9]*)$"。 13.只能輸入有兩位小數的正實數:"^[0-9]+(\.[0-9]{2})?$"。 14.只能輸入有1~3位小數的正實數:"^[0-9]+(\.[0-9]{1,3})?$"。 15.只能輸入非零的正整數:"^\+?[1-9][0-9]*$"。 16.只能輸入非零的負整數:"^\-[1-9][0-9]*$"。 17.只能輸入長度為3的字符:"^.{3}$"。 18.只能輸入由26個英文字母組成的字符串:"^[A-Za-z]+$"。 19.只能輸入由26個大寫英文字母組成的字符串:"^[A-Z]+$"。 20.只能輸入由26個小寫英文字母組成的字符串:"^[a-z]+$"。 21.驗證是否含有^%&',;=?$\"等字符:"[%&',;=?$\\^]+"。 22.只能輸入漢字:"^[\u4e00-\u9fa5]{0,}$"。 23.驗證URL:"^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$"。 24.驗證一年的12個月:"^(0?[1-9]|1[0-2])$"正確格式為:"01"~"09"和"10"~"12"。 25.驗證一個月的31天:"^((0?[1-9])|((1|2)[0-9])|30|31)$"正確格式為;"01"~"09"、"10"~"29"和“30”~“31”。 26.獲取日期正則表達式:\\d{4}[年|\-|\.]\d{\1-\12}[月|\-|\.]\d{\1-\31}日? 評注:可用來匹配大多數年月日信息。 27.匹配雙字節字符(包括漢字在內):[^\x00-\xff] 評注:可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1) 28.匹配空白行的正則表達式:\n\s*\r 評注:可以用來刪除空白行 29.匹配HTML標記的正則表達式:<(\S*?)[^>]*>.*?</>|<.*? /> 評注:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對于復雜的嵌套標記依舊無能為力 30.匹配首尾空白字符的正則表達式:^\s*|\s*$ 評注:可以用來刪除行首行尾的空白字符(包括空格、制表符、換頁符等等),非常有用的表達式 31.匹配網址URL的正則表達式:[a-zA-z]+://[^\s]* 評注:網上流傳的版本功能很有限,上面這個基本可以滿足需求 32.匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 評注:表單驗證時很實用 33.匹配騰訊QQ號:[1-9][0-9]{4,} 評注:騰訊QQ號從10 000 開始 34.匹配中國郵政編碼:[1-9]\\d{5}(?!\d) 評注:中國郵政編碼為6位數字 35.匹配ip地址:([1-9]{1,3}\.){3}[1-9]。 評注:提取ip地址時有用 36.匹配MAC地址:([A-Fa-f0-9]{2}\:){5}[A-Fa-f0-9]
轉載于:https://www.cnblogs.com/10-19-92/p/6758455.html
總結
以上是生活随笔為你收集整理的iOS 正则表达式使用的三种方式语法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#设计模式总结
- 下一篇: jmeter分布式测试配置