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