oc中正则表达式NSRegularExpression类详解

正则表达式的创建

NSRegularExpression

iOS中 NSRegularExpression类代表正则表达式,下面我们来看看的NSRegularExpression.h头文件声明定义

属性声明:

///正则匹配模式
@property (readonly, copy) NSString *pattern;
///正则匹配选项
@property (readonly) NSRegularExpressionOptions options;
///捕获的数量
@property (readonly) NSUInteger numberOfCaptureGroups;

可以看到属性都是可读的, 其中options是一个 NSRegularExpressionOptions枚举类型

typedef NS_OPTIONS(NSUInteger, NSRegularExpressionOptions) {
   NSRegularExpressionCaseInsensitive             = 1 << 0,     /* Match letters in the pattern independent of case. 不区分字母大小写的模式*/
   NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1,     /* Ignore whitespace and #-prefixed comments in the pattern. 忽略掉正则表达式中的空格和#号之后的字符*/
   NSRegularExpressionIgnoreMetacharacters        = 1 << 2,     /* Treat the entire pattern as a literal string. 将正则表达式整体作为字符串处理*/
   NSRegularExpressionDotMatchesLineSeparators    = 1 << 3,     /* Allow . to match any character, including line separators. 允许.匹配任何字符,包括换行符 */
   NSRegularExpressionAnchorsMatchLines           = 1 << 4,     /* Allow ^ and $ to match the start and end of lines. 允许^和$符号匹配行的开头和结尾*/
   NSRegularExpressionUseUnixLineSeparators       = 1 << 5,     /* Treat only \n as a line separator (otherwise, all standard line separators are used). 设置\n为唯一的行分隔符,否则所有的都有效。*/
   NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6      /* Use Unicode TR#29 to specify word boundaries (otherwise, traditional regular expression word boundaries are used). 使用Unicode TR#29标准作为词的边界,否则所有传统正则表达式的词边界都有效*/
};

方法列表声明

创建正则表达式对象提供了一个类方法和一个实例方法,可以看到需要提供正则匹配的pattern (模式),匹配条件选项和错误地址。

+ (nullable NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;

- (nullable instancetype)initWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error NS_DESIGNATED_INITIALIZER;

我们已经知道正则表达式怎么创建了,下面让我们看看怎么使用, 头文件分别用NSRegularExpression (NSMatching) 和 NSRegularExpression (NSReplacement) 定义了一系列方法供开发者用来检索和替换。

+ (NSString *)escapedPatternForString:(NSString *)string;

正则表达式的匹配

匹配方法都声明在 NSRegularExpression (NSMatching)分类中

@interface NSRegularExpression (NSMatching)

/* 
 遍历的模式,正则表达式匹配在指定options和range模式下匹配指定string,传入block中可以获取结果信息
*/
- (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (NS_NOESCAPE ^)(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL *stop))block;
/*
 在指定options和range模式下匹配指定string,通过正则匹配返回一个匹配结果的数组
*/
- (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
/*
  返回满足条件的匹配次数
*/
- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;

/*
 匹配返回的第一个结果,NSTextCheckingResult类型
*/
- (nullable NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
/*
 匹配返回的第一个结果的NSRange范围信息
*/
- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
@end

NSMatchingOptions 枚举

typedef NS_OPTIONS(NSUInteger, NSMatchingOptions) {
   NSMatchingReportProgress         = 1 << 0, //找到最长的匹配字符串后调用block回调
   NSMatchingReportCompletion       = 1 << 1, //找到任何一个匹配串后都回调一次block
   NSMatchingAnchored               = 1 << 2, //从匹配范围的开始处进行匹配
   NSMatchingWithTransparentBounds  = 1 << 3, //允许匹配的范围超出设置的范围
   NSMatchingWithoutAnchoringBounds = 1 << 4  //禁止^和$自动匹配行还是和结束
};

NSMatchingFlags 枚举

typedef NS_OPTIONS(NSUInteger, NSMatchingFlags) {
   NSMatchingProgress               = 1 << 0, //匹配到最长串后被设置     
   NSMatchingCompleted              = 1 << 1, //全部分配完成后被设置    
   NSMatchingHitEnd                 = 1 << 2, //匹配到设置范围的末尾时被设置   
   NSMatchingRequiredEnd            = 1 << 3, //当前匹配到的字符串在匹配范围的末尾时被设置     
   NSMatchingInternalError          = 1 << 4  //由于错误导致的匹配失败时被设置   
};

正则表达式的替换

用新的字段来替换原文中符合规则的字段的方法都声明在 NSRegularExpression (NSReplacement) 分类中


@interface NSRegularExpression (NSReplacement)

/* 
 在指定的options和指定的range中,用新字段替换原文本中的对应字段,并返回操作后的NSString
*/
- (NSString *)stringByReplacingMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;

/*
 用新字段替换原文本中的对应字段,并返回操作次数(替换字段的个数)
*/
- (NSUInteger)replaceMatchesInString:(NSMutableString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;

/* 
 在 string 中查找由 result + offset 指定的字符串, 返回 template 指定的字符串(比如$0-9等)
*/
- (NSString *)replacementStringForResult:(NSTextCheckingResult *)result inString:(NSString *)string offset:(NSInteger)offset template:(NSString *)templ;

/* 
 正则表达式字符串, 包括一些特殊字符. 
*/
+ (NSString *)escapedTemplateForString:(NSString *)string;
@end 

如果觉得原生的复杂,github上面star比较多的也开源库
如 objective-C-RegEx-Categories 简单好用。

你可能感兴趣的:(oc中正则表达式NSRegularExpression类详解)