正則表示式在iOS開發中的應用
阿新 • • 發佈:2020-06-24
在iOS開發過程中,正則的使用還是比較常見,用來判斷使用者名稱、手機號等的輸入。當碰到這種需求的時候,部分開發的第一印象可能是使用 NSPredicate 的 SELF MATCHES %@ 進行判斷,但遺憾的是此方法並非萬能,存在檢查不出來的情況。其實蘋果專門提供了 NSRegularExpression 這個類來做正則校驗。
NSPredicate
NSPredicate 可能是我們一開始接觸iOS正則實現的方法,但現實是它只能簡單的完成正則功能,並沒有 NSRegularExpression 強大,同時還存在校驗不出來的情況。
NSString *regEx = @"<正則表示式>" ;
NSString *string = @"<待匹配的字串>";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regEx];
BOOL matched = [predicate evaluateWithObject:string];
NSLog(@"是否匹配 = %d",matched);
複製程式碼
NSRegularExpression,真正的正則實現 初始化NSRegularExpression**
/// 初始化NSRegularExpression,如果出錯則會返回nil,並帶有error
/// @param pattern 正則表示式
/// @param options 模式選項,一般設成 kNilOptions
/// @parma error 錯誤
+ (nullable NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
複製程式碼
關於NSRegularExpressionOptions
typedef NS_OPTIONS(NSUInteger,NSRegularExpressionOptions) {
NSRegularExpressionCaseInsensitive = 1 << 0,//不區分字母大小寫的模式
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1,//忽略掉正則表示式中的空格和#號之後的字元
NSRegularExpressionIgnoreMetacharacters = 1 << 2,//將正則表示式整體作為字串處理
NSRegularExpressionDotMatchesLineSeparators = 1 << 3,//允許.匹配任何字元,包括換行符
NSRegularExpressionAnchorsMatchLines = 1 << 4,//允許^和$符號匹配行的開頭和結尾
NSRegularExpressionUseUnixLineSeparators = 1 << 5,//設定\n為唯一的行分隔符,否則所有的都有效。
NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 //使用Unicode TR#29標準作為詞的邊界,否則所有傳統正則表示式的詞邊界都有效
};
複製程式碼
前面提到 options 一般設成 kNilOptions ,它的效果就是區分大小寫,嚴格校驗。
匹配 獲取匹配的個數
NSString *regEx = @"<正則表示式>";
NSString *string = @"<待匹配的字串>";
NSError *error;
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regEx options:kNilOptions error:&error];
if (error) {
NSLog(@"error = %@",error);
}
NSUInteger number = [regularExpression numberOfMatchesInString:string options:kNilOptions range:NSMakeRange(0,string.length)];
NSLog(@"匹配的個數 = %lu",(unsigned long)number);
BOOL matched = (number != 0);
NSLog(@"是否匹配 = %d",matched);
複製程式碼
獲取第一個匹配的結果
NSString *regEx = @"<正則表示式>";
NSString *string = @"<待匹配的字串>";
NSError *error;
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regEx options:kNilOptions error:&error];
if (error) {
NSLog(@"error = %@",error);
}
NSTextCheckingResult *firstMatch = [regularExpression firstMatchInString:string options:0 range:NSMakeRange(0,string.length)];
if (firstMatch) {
// NSTextCheckingResult 的 range 屬性即匹配的字串的位置
NSString *matchedString = [string substringWithRange:firstMatch.range];
NSLog(@"匹配的字串 = %@",matchedString);
}
複製程式碼
獲取所有匹配的結果
NSString *regEx = @"<正則表示式>";
NSString *string = @"<待匹配的字串>";
NSError *error;
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regEx options:kNilOptions error:&error];
if (error) {
NSLog(@"error = %@",error);
}
NSArray *matchArray = [regularExpression matchesInString:string options:0 range:NSMakeRange(0,string.length)];
for (NSTextCheckingResult *match in matchArray) {
NSString *matchedString = [string substringWithRange:match.range];
NSLog(@"匹配的字串 = %@",matchedString);
}
複製程式碼
替換匹配的字串
NSString *regEx = @"<正則表示式>";
NSString *string = @"<待匹配的字串>";
NSString *replacingString = @"<替換的字串>";
NSError *error;
NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:regEx options:kNilOptions error:&error];
if (error) {
NSLog(@"error = %@",error);
}
NSString *newString = [regularExpression stringByReplacingMatchesInString:string options:kNilOptions range:NSMakeRange(0,string.length) withTemplate:replacingString];
NSLog(@"替換後的字串 = %@",newString);
複製程式碼