還是上次的@效果,要從一串字符串中匹配出符合條件(以@開頭且為車牌號)的字符串切蟋。
首先根據(jù)條件寫個正則:
NSString *carNumberPattern = @"[@]{1}[\u4E00-\u9FA5]{1}[A-Z]{1}[A-Z_0-9]{5}";
然后就用到了iOS自帶的NSRegularExpression這個類去解析這個正則表達(dá)式,類方法快速創(chuàng)建對象:
+ (nullable NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
第一個參數(shù)不用說就是要解析的正則表達(dá)式颊咬,第二個參數(shù)作用如下:
typedef NS_OPTIONS(NSUInteger, NSRegularExpressionOptions) {
NSRegularExpressionCaseInsensitive = 1 << 0, //不區(qū)分字母大小寫的模式
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, //忽略掉正則表達(dá)式中的空格和#號之后的字符
NSRegularExpressionIgnoreMetacharacters = 1 << 2, //將正則表達(dá)式整體作為字符串處理
NSRegularExpressionDotMatchesLineSeparators = 1 << 3, //允許.匹配任何字符肪笋,包括換行符
NSRegularExpressionAnchorsMatchLines = 1 << 4, //允許^和$符號匹配行的開頭和結(jié)尾
NSRegularExpressionUseUnixLineSeparators = 1 << 5, //設(shè)置\n為唯一的行分隔符,否則所有的都有效呜袁。
NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 //使用Unicode TR#29標(biāo)準(zhǔn)作為詞的邊界敌买,否則所有傳統(tǒng)正則表達(dá)式的詞邊界都有效
};
因?yàn)檐嚺铺栔袥]有小寫字母,所以操作選項(xiàng)不能選第一個:
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:carNumberPattern options:NSRegularExpressionDotMatchesLineSeparators error:&error ];
這個對象有下面幾個方法可以獲取到符合條件的信息:
- (NSArray<NSTextCheckingResult *> *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;//返回所有匹配結(jié)果的數(shù)組
- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;//返回所有匹配結(jié)果的個數(shù)
- (nullable NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;//返回第一個匹配結(jié)果
- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;//返回第一個匹配結(jié)果的range
因?yàn)榭赡苡卸鄠€@阶界,所以用第一個方法虹钮。這個方法返回了一個裝有NSTextCheckingResult對象的數(shù)組,NSTextCheckingResult對象有一個range屬性膘融,記錄了它所處的范圍芙粱。注:這個中的元素順序是倒序排列的,例如第一個符合條件的結(jié)果放在了數(shù)組的最末尾氧映〈号希可以在得到range之后按location進(jìn)行一次升序排列。