默认需求如下:
后台发送过来的原文本:
xxxxxx[a:b]xxxxxx
客户端显示出来的文本:
xxxxxxaxxxxxx
客户端读出来的文本:
xxxxxxbxxxxxx
示例:
后台发送过来的原文本:
剩余3分以[666:六六六]的形式发送给你
客户端显示出来的文本:
剩余3分以666的形式发送给你
客户端读出来的文本:
剩余3分以六六六的形式发送给你
所以设置默认三个规则如下:
规则一:@"\[.?\]"
规则二:@"\[.?\:"
规则三: @"\:.*?\]"
如果[]中间没有:号也不需要匹配
---
#####.h文件
// Copyright © 2016年 XDYB. All rights reserved.
//
import <Foundation/Foundation.h>
@interface PatternString : NSObject
/**
*根据默认规则生成字符串
*比如:将[666:六六六]正则后,数组第一个元素是666,第二个元素是六六六
*/
+(NSMutableArray *)PatternString:(NSString *)string;
/**
*参数一:需要正则的字符串
*参数二:正则一
*参数三:正则二
*参数四:正则三
*/
- (NSMutableArray<NSTextCheckingResult *> *)matchesInStringAllFit:(NSString *)string entirePattern:(NSString *)entirePattern firstPattern:(NSString *)firstPattern lastPattern:(NSString *)lastPattern;
/**
*根据字符串判断是否需要正则
*/
- (BOOL)isPatternString:(NSString *)string;
/**
*根据自定的正则判断是否需要正则
*/
- (BOOL)formerlyString:(NSString *)string regularExpressionWithPattern:(NSString *)pattern;
@end
#####.m文件
// Copyright © 2016年 XDYB. All rights reserved.
//
import "PatternString.h"
@implementation PatternString
//包含默认正则表达式
+(NSMutableArray )PatternString:(NSString )string
{
NSMutableArray array = [PatternString matchesInStringAllFit:string entirePattern:@"\[.?\]" firstPattern:@"\[.?\:" lastPattern:@"\:.?\]"];
return array;
}
//提供默认规则,判断是否需要正则匹配
- (BOOL)isPatternString:(NSString )string
{
return [self formerlyString:string regularExpressionWithPattern:@"\[.?\]"];
}
//提供方法实现,判断是否需要正则匹配
-
(BOOL)formerlyString:(NSString *)string regularExpressionWithPattern:(NSString *)pattern{
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil];
//返回结果里包含区间
NSArray *arr = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];
return arr.count;
}
//根据规则生成结果包含的区间
-
(NSMutableArray<NSTextCheckingResult *> *)matchesInStringAllFit:(NSString *)string entirePattern:(NSString *)entirePattern firstPattern:(NSString *)firstPattern lastPattern:(NSString *)lastPattern
{//字符串所在的范围
NSRange rangeStr;//得到匹配结果
NSTextCheckingResult * rsult;//保留每次正则后的数据
NSMutableArray *array = [NSMutableArray arrayWithObject:string];
[array addObject:string];// 创建正则表达式对象
// 规则
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:entirePattern options:NSRegularExpressionCaseInsensitive error:nil];//返回结果里包含区间
NSArray *arr = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];
//遍历结果数组
NSUInteger count = arr.count;
int i = 2;while (i > 0) {
i = i- 1;while (count > 0) { //得到匹配结果 rsult = arr[--count]; rangeStr = rsult.range; NSArray *arrayFirst = [self matchesInString:array.firstObject entirePattern:entirePattern firstPattern:firstPattern lastPattern:lastPattern]; [array replaceObjectAtIndex:0 withObject:arrayFirst.firstObject]; NSArray *arrayLast = [self matchesInString:array.lastObject entirePattern:entirePattern firstPattern:firstPattern lastPattern:lastPattern]; [array replaceObjectAtIndex:1 withObject:arrayLast.lastObject]; }}
return array;
}
//根据规则返回存放 后两种规则处理过的 数组字符串
-
(NSArray *)matchesInString:(NSString *)string entirePattern:(NSString *)entirePattern firstPattern:(NSString *)firstPattern lastPattern:(NSString *)lastPattern
{//定义规则
//规则1 ------[]-------
// NSString pattern1 = @"\[.?\]";
NSString *pattern1 = entirePattern;
NSString *pattern1String = [self matchesInString:string regularExpressionWithPattern:entirePattern];
//规则2 ------[:-------
// NSString pattern2 = @"\[.?\:";
NSString *pattern2String = [self matchesInString:pattern1String regularExpressionWithPattern:firstPattern];
//规则3 ------:]-------
// NSString pattern3 = @"\:.?\]";
NSString *pattern3String = [self matchesInString:pattern1String regularExpressionWithPattern:lastPattern];
//规则结果1
NSString *patternHeadStr = [self stringByReplacingString:pattern2String withReplacingFirstPatternString:@"" withReplacingLastPatternString:@""];
//规则结果2
NSString *patternTailStr = [self stringByReplacingString:pattern3String withReplacingFirstPatternString:@"" withReplacingLastPatternString:@""];
if(patternHeadStr == nil || patternTailStr == nil)//如果中括号中间没有:号直接返回
{
return @[string,string];
}
//最终结果
NSString *finallyHeadString = [self matchesInString:string regularExpressionWithPattern:pattern1 stringByReplacingOccurrencesWithString:patternHeadStr];
NSString *finallyTailString = [self matchesInString:string regularExpressionWithPattern:pattern1 stringByReplacingOccurrencesWithString:patternTailStr];
return @[finallyHeadString,finallyTailString];
}
//将规则字符串的首尾替换
- (NSString *)stringByReplacingString:(NSString *)str withReplacingFirstPatternString:(NSString *)firstReplacement withReplacingLastPatternString:(NSString *)lastReplacement
{
NSRange range = NSMakeRange(0, 1);
str = [str stringByReplacingCharactersInRange:range withString:firstReplacement];
NSRange range1 = NSMakeRange(str.length - 1, 1);
str = [str stringByReplacingCharactersInRange:range1 withString:lastReplacement];
return str;
}
//根据规则生成一个截取到的规则字符串
-
(NSString *)matchesInString:(NSString *)string regularExpressionWithPattern:pattern
{
//字符串所在的范围
NSRange rangeStr;//匹配的字符串
NSString *matchesInStr;//得到匹配结果
NSTextCheckingResult * rsult;
// 创建正则表达式对象
// 规则
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil];
//返回结果里包含区间
NSArray *arr = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];
//遍历结果数组
NSUInteger count = arr.count;
while (count > 0) {
//得到匹配结果
rsult = arr[--count];
rangeStr = rsult.range;
//得到匹配字符串
matchesInStr = [string substringWithRange:rangeStr];;
}return matchesInStr;
}
//根据规则生成一个替换的字符串
-
(NSString *)matchesInString:(NSString *)string regularExpressionWithPattern:(NSString *)pattern stringByReplacingOccurrencesWithString:(NSString *)replacement
{NSString *replacingStr;
//字符串所在的范围
NSRange rangeStr;//匹配的字符串
NSString *matchesInStr;//得到匹配结果
NSTextCheckingResult * rsult;// 创建正则表达式对象
// 规则
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil];
//返回结果里包含区间
NSArray *arr = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];//遍历结果数组
NSUInteger count = arr.count;
while (count > 0) {
//得到匹配结果
rsult = arr[--count];
rangeStr = rsult.range;
//得到匹配字符串
matchesInStr = [string substringWithRange:rangeStr];
//将得到的字符串的位置替换为X
replacingStr = [string stringByReplacingOccurrencesOfString:matchesInStr withString:replacement];
}return replacingStr;
}
@end














网友评论