NSPredicate 不能判斷全角字符

iOS 中的正則表達式判斷能夠用兩種類型來實現,既 NSPredicateNSRegularExpressionhtml

1、 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

2、使用NSRegularExpression

NSRegularExpressionCore 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))
複製代碼

3、關於匹配數字

用正則表達式匹配數字的時候,須要特別注意 \d匹配的不僅是0-9這樣的阿拉伯數字,而是Unicode 裏面的 'Number, Decimal Digit集合,若是須要匹配0-9(大部分都是這樣吧),則須要寫成[0-9]。參考 這裏

4、全角和半角之間的轉換

#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

相關文章
相關標籤/搜索