1.什么是正則表達(dá)式
正則表達(dá)式,又稱正規(guī)表示法,是對字符串操作的一種邏輯公式。正則表達(dá)式可以檢測給定的字符串是否符合我們定義的邏輯,也可以從字符串中獲取我們想要的特定部分。它可以迅速地用極簡單的方式達(dá)到字符串的復(fù)雜控制。
2.語法
- 1.特殊符號’^'和’$'。他們的作用是分別指出一個字符串的開始和結(jié)束。例:
“^one”:表示所有以”one”開始的字符串(”one cat”,”one123″,·····);
類似于:- (BOOL)hasPrefix:(NSString *)aString;
“a dog$”:表示所以以”a dog”結(jié)尾的字符串(”it is a dog”,·····);
類似于:- (BOOL)hasSuffix:(NSString *)aString;
“^apple$”:表示開始和結(jié)尾都是”apple”的字符串,這個是唯一的~;
“banana”:表示任何包含”banana”的字符串。
類似于 iOS8的新方法- (BOOL)containsString:(NSString *)aString,搜索子串用的。
- 2.‘*’,’+'和’?'這三個符號,表示一個或N個字符重復(fù)出現(xiàn)的次數(shù)。它們分別表示“沒有或更多”([0,+∞]取整),“一次或更多”([1,+∞]取整),“沒有或一次”([0,1]取整)。例:
“ab*”:表示一個字符串有一個a后面跟著零個或若干個b(”a”, “ab”, “abbb”,……);
“ab+”:表示一個字符串有一個a后面跟著至少一個b或者更多( ”ab”, “abbb”,……);
“ab?”:表示一個字符串有一個a后面跟著零個或者一個b( ”a”, “ab”);
“a?b+$”:表示在字符串的末尾有零個或一個a跟著一個或幾個b( ”b”, “ab”,”bb”,”abb”,……)
- 3.大括號括起來({}),表示一個重復(fù)的具體范圍。例:
“ab{4}”:表示一個字符串有一個a跟著4個b(”abbbb”);
“ab{1,}”:表示一個字符串有一個a跟著至少1個b(”ab”,”abb”,”abbb”,……);
“ab{3,4}”:表示一個字符串有一個a跟著3到4個b(”abbb”,”abbbb”)。
那么,“*”可以用{0,}表示,“+”可以用{1,}表示,“?”可以用{0,1}表示
注意:可以沒有下限,但是不能沒有上限!例如“ab{,5}”是錯誤的寫法
- 4.“ | ”表示“或”操作:
“a|b”:表示一個字符串里有”a”或者”b”;
“(a|bcd)ef”:表示”aef”或”bcdef”;
“(a|b)*c”:表示一串”a”"b”混合的字符串后面跟一個”c”;
- 5.方括號”[ ]“表示在括號內(nèi)的眾多字符中,選擇1-N個括號內(nèi)的符合語法的字符作為結(jié)果,例:
“[ab]“:表示一個字符串有一個”a”或”b”(相當(dāng)于”a|b”);
“[a-d]“:表示一個字符串包含小寫的’a'到’d'中的一個(相當(dāng)于”a|b|c|d”或者”[abcd]“);
“^[a-zA-Z]“:表示一個以字母開頭的字符串;
“[0-9]a”:表示a前有一位的數(shù)字;
“[a-zA-Z0-9]$”:表示一個字符串以一個字母或數(shù)字結(jié)束。
- 6.“.”匹配除“\r\n”之外的任何單個字符,例:
“a.[a-z]“:表示一個字符串有一個”a”后面跟著一個任意字符和一個小寫字母;
“^.{5}$”:表示任意1個長度為5的字符串;
“\num” 其中num是一個正整數(shù)。表示”\num”之前的字符出現(xiàn)相同的個數(shù),例如
“(.)\1″:表示兩個連續(xù)的相同字符。
“10\{1,2\}” : 表示數(shù)字1后面跟著1或者2個0 (“10″,”100″)。
” 0\{3,\} ” 表示數(shù)字為至少3個連續(xù)的0 (“000”,“0000”,······)
- 7.在方括號里用’'表示不希望出現(xiàn)的字符,’'應(yīng)在方括號里的第一位。
[“@[^a-zA-Z]4](mailto:%E2%80%9C@[^a-zA-Z]4)@”表示兩個”@”中不應(yīng)該出現(xiàn)字母)。
- 8.常用的還有:
“ \d ”匹配一個數(shù)字字符。等價于[0-9]。
“ \D”匹配一個非數(shù)字字符。等價于[^0-9]。
“ \w ”匹配包括下劃線的任何單詞字符。等價于“[A-Za-z0-9_]”。
“ \W ”匹配任何非單詞字符。等價于“[^A-Za-z0-9_]”。
iOS中書寫正則表達(dá)式,碰到轉(zhuǎn)義字符,多加一個“\”,例如:
全數(shù)字字符:@”^\\d\+$”
3.正則表達(dá)式在iOS中的簡單應(yīng)用
/** 正則匹配手機(jī)號 */
+ (BOOL)checkTelNumber:(NSString *) telNumber;
+ (BOOL)checkTelNumber:(NSString *) telNumber
{
NSString *pattern = @"^1+[3578]+\\d{9}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:telNumber];
if (telNumber.length != 11) {
return NO;
}
return isMatch;
}
/** 正則匹配用戶密碼6-18位數(shù)字和字母組合 */
+ (BOOL)checkPassword:(NSString *) password;
+ (BOOL)checkPassword:(NSString *) password
{
NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:password];
return isMatch;
}
/** 正則匹配用戶姓名,20位的中文或英文 */
+ (BOOL)checkUserName : (NSString *) userName;
+ (BOOL)checkUserName : (NSString *) userName
{
NSString *pattern = @"^[a-zA-Z\u4E00-\u9FA5]{1,20}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:userName];
return isMatch;
}
/** 正則匹配用戶身份證號 */
+ (BOOL)checkUserIdCard: (NSString *) idCard;
+ (BOOL)checkUserIdCard: (NSString *) idCard
{
NSString *pattern = @"(^[0-9]{15}$)|([0-9]{17}([0-9]|X)$)";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:idCard];
return isMatch;
}
/** 正則匹配URL */
+ (BOOL)checkURL : (NSString *) url;
+ (BOOL)checkURL : (NSString *) url
{
NSString *pattern = @"^[0-9A-Za-z]{1,50}";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", pattern];
BOOL isMatch = [pred evaluateWithObject:url];
return isMatch;
}
4.其他常用的正則表達(dá)式
- 校驗密碼強度
密碼的強度必須包含大小寫字母和數(shù)字的組合,不能使用特殊字符,長度在8-10之間
^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$
- 校驗中文
字符串只能是中文
^[\\u4e00-\\u9fa5]{0,}$
- 由數(shù)字,26個英文字母或下劃線組成的字符串
^\\w+$
- 校驗E-Mail 地址
[\\w!#$%&'*+/=?^_`{|}~-]+(?:\\.[\\w!#$%&'*+/=?^_`{|}~-]+)*@(?:[\\w](?:[\\w-]*[\\w])?\\.)+[\\w](?:[\\w-]*[\\w])?
- 校驗身份證號碼
15位:
^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$
18位:
^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}([0-9]|X)$
- 校驗日期
“yyyy-mm-dd“ 格式的日期校驗,已考慮平閏年
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
- 校驗金額
金額校驗,精確到2位小數(shù)
^[0-9]+(.[0-9]{2})?$
- 校驗手機(jī)號
下面是國內(nèi) 13、15、18開頭的手機(jī)號正則表達(dá)式
^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\\d{8}$
- 判斷IE的版本
^.*MSIE [5-8](?:\\.[0-9]+)?(?!.*Trident\\/[5-9]\\.0).*$
- 校驗IP-v4地址
\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b
- 校驗IP-v6地址
(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))
- 檢查URL的前綴
if (!s.match(/^[a-zA-Z]+:\\/\\//)){ s = 'http://' + s;}
- 提取URL鏈接
^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?
- 文件路徑及擴(kuò)展名校驗
^([a-zA-Z]\\:|\\\\)\\\\([^\\\\]+\\\\)*[^\\/:*?"<>|]+\\.txt(l)?$
- 提取Color Hex Codes
^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$
- 提取網(wǎng)頁圖片
\\< *[img][^\\\\>]*[src] *= *[\\"\\']{0,1}([^\\"\\'\\ >]*)
- 提取頁面超鏈接
(<a\\s*(?!.*\\brel=)[^>]*)(href="https?:\\/\\/)((?!(?:(?:www\\.)?'.implode('|(?:www\\.)?', $follow_list).'))[^"]+)"((?!.*\\brel=)[^>]*)(?:[^>]*)>
- 查找CSS屬性
^\\s*[a-zA-Z\\-]+\\s*[:]{1}\\s[a-zA-Z0-9\\s.#]+[;]{1}
- 抽取注釋
- 匹配HTML標(biāo)簽
<\\/?\\w+((\\s+\\w+(\\s*=\\s*(?:".*?"|'.*?'|[\\^'">\\s]+))?)+\\s*|\\s*)\\/?>