iOS 中的正則表達式判斷能夠用兩種類型來實現,既 NSPredicate
和NSRegularExpression
。html
NSPredicate
NSPredicate
謂詞,結合 SELF MATCHES
來實現正則表達式的判斷。例如:git
判斷是不是英文字母和數字正則表達式
NSString *text = @"AWEFDSF1234123";
NSString *regexString = @"^[A-Za-z0-9]*$";
NSPredicate *regex = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regexString];
BOOL result = [regex evaluateWithObject:text];
複製代碼
可是項目上線一段時間後發現了 bug,複製粘貼的字符串有可能有全角字符,而這個NSPredicate
驗證不出來。數組
例如:AWEFDSF1234123
也能驗證成功,而服務器是不認 全角字符的,這就坑爹了。bash
NSRegularExpression
NSRegularExpression
是Core Foundation
中的正則表達式。功能也不少,能夠返回把全部匹配結果的數組,匹配的總數,第一個匹配結果,第一個匹配的range。服務器
通常咱們驗證的話只要是否匹配到就行了,能夠用下面的方法:post
NSString *text = @"AWEFDSF1234123";
NSString *regexString = @"^[A-Za-z0-9]*$";
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:regexString options:0 error:nil];
NSTextCheckingResult *r = [regex firstMatchInString:text options:0 range:NSMakeRange(0, text.length)];
BOOL result = r ? YES : NO;
複製代碼
這個方法能正確返回結果。測試
再簡單封裝一下,使用更方便:ui
+ (BOOL)validateString:(NSString*)stringToSearch withRegex:(NSString*)regexString {
if (![stringToSearch isKindOfClass:[NSString class]] ||
![regexString isKindOfClass:[NSString class]]) {
return NO;
}
if (stringToSearch.length == 0 ||
regexString.length == 0) {
return NO;
}
NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:regexString options:0 error:nil];
NSTextCheckingResult *r = [regex firstMatchInString:stringToSearch options:0 range:NSMakeRange(0, stringToSearch.length)];
BOOL result = r ? YES : NO;
return result;
}
複製代碼
測試發現下面的方法判斷全角符號也能正確驗證:編碼
NSRange range = [text rangeOfString:regexString options:NSRegularExpressionSearch];
BOOL result = range.location == NSNotFound ? NO : YES;
NSLog(@"Test isTaxNumber %@",@(result))
複製代碼
用正則表達式匹配數字的時候,須要特別注意 \d
匹配的不僅是0-9這樣的阿拉伯數字,而是Unicode 裏面的 'Number, Decimal Digit
集合,若是須要匹配0-9(大部分都是這樣吧),則須要寫成[0-9]
。參考 這裏
#import <Foundation/Foundation.h>
@interface NSString (X)
/**
全角轉半角
@return 轉化後的文本
*/
- (NSString *)replaceSpecialWhitespace;
/**
半角轉全角
@return 轉化後的文本
*/
- (NSString *)replaceNormalWhiteSpace;
@end
#import "NSString+X.h"
@implementation NSString (X)
- (NSString *)replaceSpecialWhitespace{
NSMutableString *convertedString = [self mutableCopy];
CFStringTransform((CFMutableStringRef)convertedString, NULL, kCFStringTransformFullwidthHalfwidth, false);
return [NSString stringWithString:convertedString];
}
- (NSString *)replaceNormalWhiteSpace{
NSMutableString *convertedString = [self mutableCopy];
CFStringTransform((CFMutableStringRef)convertedString, NULL, kCFStringTransformHiraganaKatakana, false);
return [NSString stringWithString:convertedString];
}
@end
複製代碼
https://blog.csdn.net/j_r_k/article/details/78204578
https://www.jianshu.com/p/66ee05f4c7b0
全角半角轉換:
https://blog.csdn.net/j_r_k/article/details/78204578
https://www.cnblogs.com/Doule/p/6567418.html
全角英語字母,全角阿拉伯數字,漢語數字對應的unicode編碼:https://blog.csdn.net/mx472756841/article/details/53379762