NSRegularExpression iOS自带的正则表达式

发布时间:2021-07-23 10:45:22

? ? ?以前做验证邮箱,电话号码的时候通常用第三方的正则表达式或者NSPredicate(点这里查看以前的文章),在后期,苹果推出了自己的正则表达式来提供给开发者调用,很方便,功能也强大.


? ? ? 具体可以查看官方文档,包括如何书写进行匹配的正则表达式例子,这里我就不多加详述了,因为本人看那一堆符号好烦.....只好直接求助于谷歌了,下面只给出几个常用的.



#define KPhoneRegex @"\d{3}-\d{8}|\d{3}-\d{7}|\d{4}-\d{8}|\d{4}-\d{7}|1+[358]+\d{9}|\d{8}|\d{7}"
#define KWebRegex @"((http[s]{0,1}|ftp)://[a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,4})(:\d+)?(/[a-zA-Z0-9\.\-~!@#$%^&*+?:_/=<>]*)?)|(www.[a-zA-Z0-9\.\-]+\.([a-zA-Z]{2,4})(:\d+)?(/[a-zA-Z0-9\.\-~!@#$%^&*+?:_/=<>]*)?)"
#define KWebOtherRegex @"http+:[^\s]*"
#define KEmailRegex @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}"



/**
1. 返回所有匹配结果的集合(适合,从一段字符串中提取我们想要匹配的所有数据)
* - (NSArray *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
2. 返回正确匹配的个数(通过等于0,来验证邮箱,电话什么的,代替NSPredicate)
* - (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
3. 返回第一个匹配的结果。注意,匹配的结果保存在 NSTextCheckingResult 类型中
* - (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
4. 返回第一个正确匹配结果字符串的NSRange
* - (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
5. block方法
* - (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block;
*/

/**
* enum {
NSRegularExpressionCaseInsensitive = 1 << 0, // 不区分大小写的
NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, // 忽略空格和# -
NSRegularExpressionIgnoreMetacharacters = 1 << 2, // 整体化
NSRegularExpressionDotMatchesLineSeparators = 1 << 3, // 匹配任何字符,包括行分隔符
NSRegularExpressionAnchorsMatchLines = 1 << 4, // 允许^和$在匹配的开始和结束行
NSRegularExpressionUseUnixLineSeparators = 1 << 5, // (查找范围为整个的话无效)
NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 // (查找范围为整个的话无效)
};
typedef NSUInteger NSRegularExpressionOptions;
*/

// 下面2个枚举貌似都没什么意义,除了在block方法中,一般情况下,直接给0吧
/**
* enum {
NSMatchingReportProgress = 1 << 0,
NSMatchingReportCompletion = 1 << 1,
NSMatchingAnchored = 1 << 2,
NSMatchingWithTransparentBounds = 1 << 3,
NSMatchingWithoutAnchoringBounds = 1 << 4
};
typedef NSUInteger NSMatchingOptions;
*/

/** 此枚举值只在5.block方法中用到
* enum {
NSMatchingProgress = 1 << 0,
NSMatchingCompleted = 1 << 1,
NSMatchingHitEnd = 1 << 2,
NSMatchingRequiredEnd = 1 << 3,
NSMatchingInternalError = 1 << 4
};
typedef NSUInteger NSMatchingFlags;
*/


// 测试字符串,把里面的电话号码解析出来
NSString *urlString = @"哈哈哈哈呵呵呵s15279107723在这里啊啊啊啊s15279107716";
NSError *error = NULL;
// 根据匹配条件,创建了一个正则表达式(类方法,实例方法类似)
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:KPhoneRegex options:NSRegularExpressionCaseInsensitive error:&error];
if (regex != nil) {
// 3.....
NSTextCheckingResult *firstMatch = [regex firstMatchInString:urlString
options:0
range:NSMakeRange(0, [urlString length])];
if (firstMatch) {
NSRange resultRange = [firstMatch rangeAtIndex:0];
//从urlString中截取数据
NSString *result = [urlString substringWithRange:resultRange];
NSLog(@"result = %@",result);
}
// 2.....
NSUInteger number = [regex numberOfMatchesInString:urlString
options:0
range:NSMakeRange(0, [urlString length])];
NSLog(@"number = %ld",number);
// 5.....(坑爹的返回第一个匹配结果)
[regex enumerateMatchesInString:urlString options:0 range:NSMakeRange(0, [urlString length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
NSLog(@"---%@",NSStringFromRange([result range]));
if (flags != NSMatchingInternalError) {
NSRange firstHalfRange = [result rangeAtIndex:0];
if (firstHalfRange.length > 0) {
NSString *resultString1 = [urlString substringWithRange:firstHalfRange];
NSLog(@"result1 = %@",resultString1);
}
}
*stop = YES;
}];
}

// 替换掉你要匹配的字符串
NSString *reString = [regex stringByReplacingMatchesInString:urlString
options:0
range:NSMakeRange(0, [urlString length])
withTemplate:@"(我就是替换的值)"];
NSLog(@"reString = %@",reString);
// 还有2个方法大家可以去尝试看看


// 1.
NSMutableArray *oneArray = [self _matchLinkWithStr:urlString withMatchStr:KPhoneRegex];
for (NSString *phone in oneArray) {
NSLog(@"phone = %@",phone);
}



// 1.....
- (NSMutableArray *)_matchLinkWithStr:(NSString *)str withMatchStr:(NSString *)matchRegex;
{
NSError *error = NULL;
NSRegularExpression *reg = [NSRegularExpression regularExpressionWithPattern:matchRegex
options:NSRegularExpressionCaseInsensitive
error:&error];
NSArray *match = [reg matchesInString:str
options:NSMatchingReportCompletion
range:NSMakeRange(0, [str length])];

NSMutableArray *rangeArr = [NSMutableArray array];
// 取得所有的NSRange对象
if(match.count != 0)
{
for (NSTextCheckingResult *matc in match)
{
NSRange range = [matc range];
NSValue *value = [NSValue valueWithRange:range];
[rangeArr addObject:value];
}
}
// 将要匹配的值取出来,存入数组当中
__block NSMutableArray *mulArr = [NSMutableArray array];
[rangeArr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
NSValue *value = (NSValue *)obj;
NSRange range = [value rangeValue];
[mulArr addObject:[str substringWithRange:range]];
}];
return mulArr;
}


? ? @结果:



相关文档

  • 电脑声卡坏了怎么判断和维修
  • 写给女友的爱情诗歌
  • 平面设计专业的好看的简历封面
  • 城府深的人面相是怎样
  • 室内设计师的三种设计风格
  • 面向连接的Socket Server的简单实现
  • 小灰鸟
  • 第一次直面挖矿程序
  • bbc人脑小知识
  • 名师之路培训心得体会
  • Element 快速入门
  • 双人电脑桌品牌十大排行榜
  • 有关哲理的经典语句
  • 毕业设计??>基于SSM的网上宠物商城系统(有前台商城+商城后台)
  • 西柚灯笼
  • 乡镇禁毒工作讲话稿3篇
  • Shiro中ShiroFilterFactoryBean的filterChainDefinitionMap配置
  • ppt怎么设计创意的茶字体图标? ppt茶图标的设计方法
  • 「seo」导出链接导向相关内容部分怎么设计才能更有亮点?
  • 为了无处不在的计算,浪潮云再次出手了!
  • vue3.0 组件传值
  • [007] - JavaSE面试题(七):异常
  • 律师所实习证明模板
  • 上台演讲穿着原则
  • CentOS 7使用yum安装Nginx
  • 生活中导致抑郁症发病的原因
  • 小学生食品卫生安全的手抄报素材
  • 地税人员个人工作总结
  • 别直参是什么颜色好坏别直参颜色对比图
  • 关于好看的春节习俗手抄报图片
  • 猜你喜欢

  • 运动会演讲稿范文3篇_讲话稿
  • 汉宣帝第二位皇后霍成君简介
  • 2019年贵阳保利瑞廷温泉酒店年营销策划方案.doc
  • 买二手房时 买方还要再交一次房屋维修基金吗?
  • 最新文档-Unit 3 I'm more outgoing than my sister. 第二课时 Section A (2d-3c)-PPT精品文档
  • 2017关于学雷锋的手抄报大全
  • 立体技术的过去现在未来3D
  • 2017年贵州儿科副主任及主任医师(高级职称)考试试题
  • 辽宁省幼师专科学校 2018辽宁民族师范高等专科学校招聘公告22人
  • 沈阳天佑瑞祥商贸有限公司企业信用报告-天眼查
  • 26红领巾真好教案
  • 北京艺美天成装饰工程有限公司大连分公司企业信用报告-天眼查
  • 网购消费者行为研究报告
  • 精选浙江鸭2018届高三物理一轮复习第3章牛顿运动定律实验5探究加速度与力质量的关系课后限时训练
  • 2015年江苏省数据概述基础
  • 我国高校会计课程体系和教学内容改革研究
  • 激光打印机维修从入门到精通 优质课件
  • 美丽的大自然作文:黄果树大瀑布
  • 创建一个文件夹,并在文件夹里批量创建文件,并批量改名。
  • php7 yar扩展,php扩展之Yar使用
  • 元宵节来历 元宵节的来历
  • 2019-2019年度个人工作总结
  • 手机账号怎么解除绑定
  • 流星之恋_高中高一作文900字
  • 河北中医学院优秀毕业生简约渐变导航式毕业答辩动态PPT模板
  • 北师大版初中数学八年级下册期中测试卷 2
  • 土方法祛痘印最快最有效的方法
  • 成都百思特科技有限公司企业信用报告-天眼查
  • 最新陕西省西安市中考数学模拟试卷(一)
  • 国内医药企业经营环境的SWOT分析---文本资料
  • 红椒是什么椒呢红椒有什么作用呢
  • 班级简单漂亮的黑板报设计图
  • 差班班主任教学心得
  • 绩效管理 _绩效考核面谈表
  • 青岛版三年级科学上册期末试卷附答案
  • 2018冀教版数学六年级下册第6单元2.1《角的分类复*》参考课件 (共10张PPT)
  • 黑龙江省鑫宇水电建设开发有限公司企业信用报告-天眼查
  • 非财务人员财务培训
  • 人教版八年级英语下册课件:Unit4第一课时SectionA(1a--2d)
  • 2020年春部编版三年级语文下册 28 枣核 ppt公开课课件完美
  • 新加坡东亚管理学院人力资源管理课程
  • (10份试卷合集)陕西省榆林市第二中学2019年历史高一下学期期末模拟试卷
  • 电脑版