简单的正则表达式拼接类
TigerRegular *reg = [TigerRegular new]; [reg addOptionalTextItems:@[@"http", @"ftp", @"wc"] minTimes:1 maxTimes:1]; [reg addStaticText:@"s" minTimes:0 maxTimes:1]; [reg addStaticText:@"://" minTimes:1 maxTimes:1]; [reg addCharacterInText:@"0-9A-Za-z" minLength:1 maxLength:INT_MAX]; TigerRegular *domainReg = [TigerRegular new]; [domainReg addStaticText:@"." minTimes:1 maxTimes:1]; [domainReg addCharacterInText:@"0-9A-Za-z" minLength:1 maxLength:INT_MAX]; [reg addSubRegular:domainReg.regular minTimes:0 maxTimes:3]; TigerRegular *portReg = [TigerRegular new]; [portReg addStaticText:@":" minTimes:1 maxTimes:1]; [portReg addCharacterInText:@"0-9" minLength:1 maxLength:4]; [reg addSubRegular:portReg.regular minTimes:0 maxTimes:INT_MAX]; TigerRegular *pathReg = [TigerRegular new]; [pathReg addStaticText:@"/" minTimes:1 maxTimes:1]; [pathReg addCharacterInText:@"0-9A-Za-z" minLength:1 maxLength:INT_MAX]; [reg addSubRegular:pathReg.regular minTimes:0 maxTimes:INT_MAX]; [reg addSubRegular:domainReg.regular minTimes:0 maxTimes:1]; NSLog(@"%@", reg.regular);
@interface TigerRegular : NSObject @property (nonatomic, copy, readonly) NSString *regular; - (void)addStaticText:(NSString*)text minTimes:(int)minTimes maxTimes:(int)maxTimes; - (void)addCharacterInText:(NSString*)text minLength:(int)minLength maxLength:(int)maxLength; - (void)addCharacterNotInText:(NSString*)text minLength:(int)minLength maxLength:(int)maxLength; - (void)addOptionalTextItems:(NSArray<NSString*>*)textItems minTimes:(int)minTimes maxTimes:(int)maxTimes; - (void)addSubRegular:(NSString*)regular minTimes:(int)minTimes maxTimes:(int)maxTimes; @end
#import "TigerRegular.h" typedef NSString * TigerRegularRange; typedef NSString * TigerRegularOptional; typedef NSString * TigerRegularPart; typedef NSString * TigerRegularItem; typedef NSString * TigerRegularRepeat; typedef NSString * TigerRegularConfiguration; @interface TigerRegular () @property (nonatomic, strong) NSMutableString *tigerRegular; @end @implementation TigerRegular - (instancetype)init { self = [super init]; if (self) { self.tigerRegular = [NSMutableString string]; } return self; } - (void)addStaticText:(NSString*)text minTimes:(int)minTimes maxTimes:(int)maxTimes { TigerRegularPart part = [self partWithItem:[self encodeItem:text]]; TigerRegularConfiguration configuration = [self configurationWithPart:part repeat:[self repeat:minTimes maxTimes:maxTimes]]; [self.tigerRegular appendString:configuration]; } - (void)addCharacterInText:(NSString*)text minLength:(int)minLength maxLength:(int)maxLength { TigerRegularRange range = [self range:[self encodeItem:text]]; TigerRegularPart part = [self belong:range]; TigerRegularConfiguration configuration = [self configurationWithPart:part repeat:[self repeat:minLength maxTimes:maxLength]]; [self.tigerRegular appendString:configuration]; } - (void)addCharacterNotInText:(NSString*)text minLength:(int)minLength maxLength:(int)maxLength { TigerRegularRange range = [self range:[self encodeItem:text]]; TigerRegularPart part = [self notBelong:range]; TigerRegularConfiguration configuration = [self configurationWithPart:part repeat:[self repeat:minLength maxTimes:maxLength]]; [self.tigerRegular appendString:configuration]; } - (void)addOptionalTextItems:(NSArray<NSString*>*)textItems minTimes:(int)minTimes maxTimes:(int)maxTimes { NSMutableArray <TigerRegularItem> *inputItems = [NSMutableArray array]; for (TigerRegularItem item in textItems) { [inputItems addObject:[self encodeItem:item]]; } TigerRegularOptional optional = [self optional:inputItems.copy]; TigerRegularConfiguration configuration = [self configurationWithOptional:optional repeat:[self repeat:minTimes maxTimes:maxTimes]]; [self.tigerRegular appendString:configuration]; } - (void)addSubRegular:(NSString*)regular minTimes:(int)minTimes maxTimes:(int)maxTimes { TigerRegularConfiguration configuration = [self configurationWithSubConfiguration:regular repeat:[self repeat:minTimes maxTimes:maxTimes]]; [self.tigerRegular appendString:configuration]; } - (TigerRegularRepeat)repeat:(int)minTimes maxTimes:(int)maxTimes { if (minTimes == 0 && maxTimes == 1) { return self.lessOrEqualOnce; } if (minTimes == 0 && maxTimes == INT_MAX) { return self.anyTimes; } if (minTimes == 1 && maxTimes == INT_MAX) { return self.moreThenOnce; } if (minTimes == maxTimes) { return [self matchTimes:minTimes]; } if (maxTimes == INT_MAX) { return [self matchMoreThenTimes:minTimes]; } return [self matchTimes:minTimes max:maxTimes]; } - (NSString *)regular { return self.tigerRegular.copy; } - (TigerRegularConfiguration)configurationWithOptional:(TigerRegularOptional)optional repeat:(TigerRegularRepeat)repeat { return [NSString stringWithFormat:@"(%@)%@", optional, repeat]; } - (TigerRegularConfiguration)configurationWithPart:(TigerRegularPart)part repeat:(TigerRegularRepeat)repeat { return [NSString stringWithFormat:@"(%@)%@", part, repeat]; } - (TigerRegularConfiguration)configurationWithSubConfiguration:(TigerRegularConfiguration)subConfiguration repeat:(TigerRegularRepeat)repeat { return [NSString stringWithFormat:@"(%@)%@", subConfiguration, repeat]; } - (TigerRegularPart)partWithItem:(TigerRegularItem)item { return item; } - (TigerRegularRange)range:(TigerRegularRange)range appendRange:(TigerRegularRange)otherRange { return [NSString stringWithFormat:@"%@%@", range, otherRange]; } // 属于某一个字符 - (TigerRegularPart)belong:(TigerRegularRange)range { return [NSString stringWithFormat:@"[%@]", range]; } // 不属于某一个字符 - (TigerRegularPart)notBelong:(TigerRegularRange)range { return [NSString stringWithFormat:@"[^%@]", range]; } // 可选值 - (TigerRegularOptional)optional:(NSArray<TigerRegularItem>*)optional { return [optional componentsJoinedByString:@"|"]; } // 可选字符 - (TigerRegularRange)range:(TigerRegularRange)range { return range; } // 字符区间 - (TigerRegularRange)range:(TigerRegularItem)start end:(TigerRegularItem)end { return [NSString stringWithFormat:@"%@-%@", start, end]; } // 数字 - (TigerRegularItem)number { return @"\\d"; } // 字符 - (TigerRegularItem)character { return @"\\w"; } // 空格 - (TigerRegularItem)blankSpace { return @"\\s"; } // 数字 - (TigerRegularItem)notNumber { return @"\\D"; } // 字符 - (TigerRegularItem)notCharacter { return @"\\W"; } // 空格 - (TigerRegularItem)notBlankSpace { return @"\\S"; } // 不是换行 - (TigerRegularItem)notNewLine { return @".";; } // 最多出现一次 - (TigerRegularRepeat)lessOrEqualOnce { return @"?"; } // 任意次 - (TigerRegularRepeat)anyTimes { return @"*"; } // 超过1次 - (TigerRegularRepeat)moreThenOnce { return @"+"; } // 字符串开头 - (TigerRegularConfiguration)isPrefix { return @"^"; } // 字符串结尾 - (TigerRegularConfiguration)isSuffix { return @"$"; } - (NSArray<TigerRegularItem>*)keywordItems { static NSArray<TigerRegularItem> *items = nil; if (!items) { items = @[self.notNewLine, self.lessOrEqualOnce, self.anyTimes, self.moreThenOnce, self.isPrefix, self.isSuffix]; } return items; } - (TigerRegularItem)encodeItem:(TigerRegularItem)item { TigerRegularItem newItem = item; for (TigerRegularItem object in self.keywordItems) { newItem = [newItem stringByReplacingOccurrencesOfString:object withString:[NSString stringWithFormat:@"\\%@", object]]; } return newItem; } // 出现N次 - (TigerRegularRepeat)matchTimes:(int)times { return [NSString stringWithFormat:@"{%d}", times]; } // 出现N次以上 - (TigerRegularRepeat)matchMoreThenTimes:(int)times { return [NSString stringWithFormat:@"{%d,}", times]; } // 出现M-N次之间 - (TigerRegularRepeat)matchTimes:(int)min max:(int)max { return [NSString stringWithFormat:@"{%d,%d}", min, max]; } @end