还是上次的@效果,要从一串字符串中匹配出符合条件(以@开头且为车牌号)的字符串。
首先根据条件写个正则:
NSString *carNumberPattern = @"[@]{1}[\u4E00-\u9FA5]{1}[A-Z]{1}[A-Z_0-9]{5}";
然后就用到了iOS自带的NSRegularExpression这个类去解析这个正则表达式,类方法快速创建对象:
+ (nullable NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
第一个参数不用说就是要解析的正则表达式,第二个参数作用如下:
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标准作为词的边界,否则所有传统正则表达式的词边界都有效
};
因为车牌号中没有小写字母,所以操作选项不能选第一个:
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:carNumberPattern options:NSRegularExpressionDotMatchesLineSeparators error:&error ];
这个对象有下面几个方法可以获取到符合条件的信息:
- (NSArray<NSTextCheckingResult *> *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;//返回所有匹配结果的数组
- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;//返回所有匹配结果的个数
- (nullable NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;//返回第一个匹配结果
- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;//返回第一个匹配结果的range
因为可能有多个@,所以用第一个方法。这个方法返回了一个装有NSTextCheckingResult对象的数组,NSTextCheckingResult对象有一个range属性,记录了它所处的范围。注:这个中的元素顺序是倒序排列的,例如第一个符合条件的结果放在了数组的最末尾。可以在得到range之后按location进行一次升序排列。
网友评论