正则表达式

正则表达式是对字符串操作的一种逻辑公式, 用事先定义好的一些特定字符、及这些特定字符的组合, 组成一个"规则字符串",

这个"规则字符串"用来表达对字符串的一种过滤逻辑, 正则表达式就是用于描述这些规则的工具, 或者说, 正则表达式就是记录文本规则的代码.

在开发中, 我们经常会有查找符合某些复杂规则的字符串的需要,

比如数据校验: 判断用户的输入是否合法(如:用户注册的时候,QQ号码,电话号码,邮箱是否符合要求)

下面让我们先来看看正则匹配常用的一些字符:

一. 常用通配符

.     匹配除换行符以外的任意字符

\w   匹配字母或数字或下划线或汉字

\s    匹配任意的空白符(空格,tab\t,回车\r \n)

\d    匹配数字

^     匹配字符串的开始

$     匹配字符串的结束

\b    匹配单词的开始或结束

二. 常用反义通配符

\W      匹配任意不是字母,数字,下划线,汉字的字符

\S       匹配任意不是空白符的字符

\D       匹配任意非数字的字符

\B       匹配不是单词开头或结束的位置

[^x]    匹配除了x以外的任意字符

[^aeiou]  匹配除了aeiou这几个字母以外的任意字符

三. 集合

[xyz]     匹配xyz中任意的字符

[^xyz]  匹配不是xyz中的任意字符

[a-z]     匹配从小写字母a到小写字母z之间的任意字符

[^a-z]   匹配非从小写字母a到小写字母z之间的任意字符

四. 常用限定符

*      重复零次或更多次

+     重复一次或更多次

?      重复零次或一次

{n}  重复n次

{n,} 重复n次或更多次

{n,m} 重复n到m次

五. 贪婪和懒惰模式(默认是贪婪模式;在量词后面直接加上问号,就是非贪婪模式)

*?          重复任意次,但尽可能少重复

+?         重复一次或更多次,但尽可能少重复

??          重复零次或一次,但尽可能少重复

{n,m}?  重复n到m次,但尽可能少重复

{n,}?     重复n次以上,但尽可能少重复

以上就是正则表达式的匹配规则需要使用到的字符.

下面是我在开发中时常用到的和平时收集的一些正则匹配,为了后续方便,所以整理下封装成一个工具类,提供类方法来调用,返回匹配结果.

或许上面的匹配字符有些朋友看不太明白,那就不说废话了,上代码,多看几次,然后自己尝试着去写,很快就可以明白了.

- RegularTool.h

  1. //
  2. // RegularTool.h
  3. // 正则匹配
  4. //
  5. // Created by Arvin on 15/12/3.
  6. // Copyright © 2015年 Arvin. All rights reserved.
  7. //
  8.  
  9. #import <Foundation/Foundation.h>
  10.  
  11. typedef void(^resultBlock)(NSString *res);
  12.  
  13. @interface RegularTool: NSObject
  14.  
  15. /*!
  16. * 匹配固定电话号码
  17. *
  18. * @param number 需要匹配的固话号码
  19. *
  20. * @return 返回匹配结果
  21. */
  22. + (NSString *)matchTelephoneNumber:(NSString *)number;
  23.  
  24. /*!
  25. * 匹配手机号码
  26. *
  27. * @param number 需要匹配的手机号码
  28. *
  29. * @return 返回匹配结果
  30. */
  31. + (NSString *)matchMobilephoneNumber:(NSString *)number;
  32.  
  33. /*!
  34. * 匹配3-15位的中文或英文(用户名)
  35. *
  36. * @param username 需要匹配的字符串
  37. *
  38. * @return 返回匹配结果
  39. */
  40. + (NSString *)matchUsername:(NSString *)username;
  41.  
  42. /*!
  43. * 匹配6-18位的数字和字母组合(密码)
  44. *
  45. * @param password 需要匹配的字符串
  46. *
  47. * @return 返回匹配结果
  48. */
  49. + (NSString *)matchPassword:(NSString *)password;
  50.  
  51. /*!
  52. * 匹配邮箱帐号
  53. *
  54. * @param email 需要匹配的邮箱帐号
  55. *
  56. * @return 返回匹配结果
  57. */
  58. + (NSString *)matchEmail:(NSString *)email;
  59.  
  60. /*!
  61. * 匹配身份证号码
  62. *
  63. * @param idCard 需要匹配的身份证号码
  64. *
  65. * @return 返回匹配结果
  66. */
  67. + (NSString *)matchUserIdCard:(NSString *)idCard;
  68.  
  69. /*!
  70. * 匹配URL字符串
  71. *
  72. * @param urlStr 需要匹配的URL字符串
  73. *
  74. * @return 返回匹配结果
  75. */
  76. + (NSString *)matchURLStr:(NSString *)urlStr;
  77.  
  78. /*!
  79. * 匹配¥:价格字符串
  80. *
  81. * @param priceStr 包含价格的字符串
  82. *
  83. * @return 返回匹配结果
  84. */
  85. + (BOOL)matchPriceStr:(NSString *)priceStr;
  86.  
  87. @end

- RegularTool.m

  1. //
  2. // RegularTool.m
  3. // 正则匹配
  4. //
  5. // Created by Arvin on 15/12/3.
  6. // Copyright © 2015年 Arvin. All rights reserved.
  7. //
  8.  
  9. #import "RegularTool.h"
  10.  
  11. @implementation RegularTool
  12.  
  13. #pragma mark - 匹配固定电话号码
  14. + (NSString *)matchTelephoneNumber:(NSString *)number {
  15. NSString *pattern = @"^(\\d{3,4}-)\\d{7,8}$";
  16. __block NSString *result;
  17. [RegularTool matchString:number withPattern:pattern resultBlock:^(NSString *res) {
  18. result = res;
  19. }];
  20. return result;
  21. }
  22.  
  23. #pragma mark - 匹配手机号码
  24. + (NSString *)matchMobilephoneNumber:(NSString *)number {
  25. NSString *pattern = @"^(0|86)?1([358][0-9]|7[678]|4[57])\\d{8}$";
  26. __block NSString *result;
  27. [RegularTool matchString:number withPattern:pattern resultBlock:^(NSString *res) {
  28. result = res;
  29. }];
  30. return result;
  31. }
  32.  
  33. #pragma mark - 匹配3-15位的中文或英文(用户名)
  34. + (NSString *)matchUsername:(NSString *)username {
  35. NSString *pattern = @"^[a-zA-Z一-龥]{3,15}$";
  36. __block NSString *result;
  37. [RegularTool matchString:username withPattern:pattern resultBlock:^(NSString *res) {
  38. result = res;
  39. }];
  40. return result;
  41. }
  42.  
  43. #pragma mark - 匹配6-18位的数字和字母组合(密码)
  44. + (NSString *)matchPassword:(NSString *)password {
  45. NSString *pattern = @"^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,18}$";
  46. __block NSString *result;
  47. [RegularTool matchString: password withPattern: pattern resultBlock:^(NSString *res) {
  48. result = res;
  49. }];
  50. return result;
  51. }
  52.  
  53. #pragma mark - 匹配邮箱帐号
  54. + (NSString *)matchEmail:(NSString *)email {
  55. NSString *pattern =
  56. @"^[a-z0-9]+([\\._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+\\.){1,63}[a-z0-9]+$";
  57. __block NSString *result;
  58. [RegularTool matchString:email withPattern:pattern resultBlock:^(NSString *res) {
  59. result = res;
  60. }];
  61. return result;
  62. }
  63.  
  64. #pragma mark - 匹配身份证号码
  65. + (NSString *)matchUserIdCard:(NSString *)idCard {
  66. NSString *pattern =
  67. @"(^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$)|(^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[Xx])$)";
  68. __block NSString *result;
  69. [RegularTool matchString:idCard withPattern:pattern resultBlock:^(NSString *res) {
  70. result = res;
  71. }];
  72. return result;
  73. }
  74.  
  75. #pragma mark - 匹配URL字符串
  76. + (NSString *)matchURLStr:(NSString *)urlStr {
  77. NSString *pattern = @"^[0-9A-Za-z]{1,50}$";
  78. __block NSString *result;
  79. [RegularTool matchString:urlStr withPattern: pattern resultBlock:^(NSString *res) {
  80. result = res;
  81. }];
  82. return result;
  83. }
  84.  
  85. #pragma mark - 匹配¥:价格字符串
  86. + (BOOL)matchPriceStr:(NSString *)priceStr {
  87. NSError *error = nil;
  88. NSString *pattern = @"¥(\\d+(?:\\.\\d+)?)";
  89. NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:pattern options: << error: &error];
  90. if (!error) {
  91. NSArray<NSTextCheckingResult *> *result = [regular matchesInString:priceStr options:NSMatchingWithoutAnchoringBounds range:NSMakeRange(, priceStr.length)];
  92. if (result) {
  93. for (NSTextCheckingResult *checkingRes in result) {
  94. if (checkingRes.range.location == NSNotFound) {
  95. continue;
  96. }
  97. NSLog(@"%@",[priceStr substringWithRange:checkingRes.range]);
  98. //NSLog(@"%@",[priceStr substringWithRange:[res rangeAtIndex:1]]);
  99. }
  100. }
  101. return YES;
  102. }
  103. NSLog(@"匹配失败,Error: %@",error);
  104. return NO;
  105. }
  106.  
  107. /*!
  108. * 正则匹配
  109. *
  110. * @param str 匹配的字符串
  111. * @param pattern 匹配规则
  112. *
  113. * @return 返回匹配结果
  114. */
  115. + (BOOL)matchString:(NSString *)str withPattern:(NSString *)pattern resultBlock:(resultBlock)block {
  116. NSError *error = nil;
  117. NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern: pattern options: NSRegularExpressionCaseInsensitive error: &error];
  118. if (!error) {
  119. NSTextCheckingResult *result = [regular firstMatchInString:str options: range:NSMakeRange(, str.length)];
  120. if (result) {
  121. NSLog(@"匹配成功");
  122. block([str substringWithRange:result.range]);
  123. return YES;
  124. } else {
  125. NSLog(@"匹配失败");
  126. return NO;
  127. }
  128. }
  129. NSLog(@"匹配失败,Error: %@",error);
  130. return NO;
  131. }
  132.  
  133. @end

END! 欢迎留言交流,一起学习...

iOS 中的正则匹配(工具类方法)的更多相关文章

  1. 通用且常用的Java正则匹配工具,用以检查邮箱名、电话号码、用户密码、邮政编码等合法性

    一个通用且常用的Java正则匹配工具,用以检查邮箱名.电话号码.用户密码.邮政编码等合法性. import java.util.regex.Matcher; import java.util.rege ...

  2. iOS中使用正则

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  3. Word中类似正则匹配的查找替换通配符的使用详解

    一.Word查找栏代码&通配符一览表 序号 清除使用通配符复选框 勾选使用通配符复选框 特殊字符 代码 特殊字符 代码or通配符 1 任意单个字符 ^? 任意单个字符 ? 2 任意数字 ^# ...

  4. 在notepad++中使用正则匹配功能(一-龥!-~) 中文[利刃篇]

    用正则时间越久,人就越懒,就越知道正则的强大.正则,不只是在代码里用到,在字符查找是也会用到,学会适当使用正则,将会使你的工作事办功倍!但是,中文却是一个砍,不容易过. 于是在用notepad++,也 ...

  5. javascript 中利用正则匹配 时间

    本文从百度知道回来中粘贴过来,当做一个笔记,因为,说的很详细 最简单的正则 如 : \d{4}-\d{2}-\d{2}但是实际情况却不是那么简单,,要考虑,有效性和闰年等问题..... 对于日期的有效 ...

  6. iOS 中的第三方库管理工具

    xcode没有android studio中的gradle进行第三方库管理,但是有第三方的库管理工具CocoaPods,https://github.com/CocoaPods/CocoaPods/w ...

  7. Hive 9、Hive 在表中添加正则匹配

    在Hive中还有一项比较好用的功能,也是非常重要的功能:在建表的时候可以不指定表的行.字段.列的分隔方式,通过给表指定一段正则表达式,让Hive自动去匹配: 1.创建表 CREATE TABLE ap ...

  8. Django2.0 和 Django1 中的正则匹配问题

    2.0内的path匹配正则时候无效时,导入re_path即可 from django.urls import path,re_path from king_admin import views url ...

  9. javascript中的正则匹配函数exec(),test(),match()

    test() var str = "cat";var reStr = /cat/;alert(reStr.test(str)); 输出为:true 它的返回值为true or fa ...

随机推荐

  1. 转载Eclipse中Maven WEB工程tomcat项目添加调试

    转载地址: http://blog.csdn.net/free4294/article/details/38260581 一.建立一个maven  WEB项目 1.file->new->o ...

  2. Cut the sticks

    def main(): n = int(raw_input()) arr = map(int, raw_input().strip().split()) for i in range(n): cutN ...

  3. 了不起的分支和循环02 - 零基础入门学习Python008

    了不起的分支和循环02 让编程改变世界 Change the world by program 上节课,小甲鱼教大家如何正确的打飞机,其要点就是:判断和循环,判断就是该是不该做某事,循环就是持续做某事 ...

  4. Unity有限状态机编写

    有限状态机FSM 是对行为逻辑的抽象. 在整个FSM架构中 首先有一个状态基类stateObject 里面有三个方法,分别是状态前.状态中.状态后. 所有具体行为类都要继承这个基类,在这三个方法中具体 ...

  5. Effective Java2读书笔记-对于所有对象都通用的方法(一)

    第8条:覆盖equals时请遵守通用约定 ①约定的内容 自反性.对于任何非null的引用值x.x.equals(x)必须返回true. 对称性.对于任何非null的引用值x和y.当且仅当y.equal ...

  6. 安装Oracle10g on RedHat as 4 64bit(摘)

    一.安装前的配置 1.修改RH版本 vi /etc/redhat-release Red Hat Enterprise Linux AS release 3 (Taroon Update 3) 2. ...

  7. 采购术语PR、PO、RFQ、RFI、SOW、BOM、JIT、VMI、MRO 是什么意思

    PO:Purchase Order Form 采购订单,公司对外使用,还有个PR: ,公司内部使用的采购申请单 PR (Purchase Requirent) 请购单,采购申请单,代表企业内部的申请需 ...

  8. MFC 消息的分类

    来源:孙鑫 c++ 第6集

  9. Tomcat部署项目通过—IP地址:端口访问

    如题所示,实现效果图如下: 设置如下: (1)修改${tomcat}/config/sever.xml文件虚拟内容目录: <Engine name="Catalina" de ...

  10. hdu 1561 The more, The Better_树状dp

    题目链接 题意:给你一棵树,各个节点都有价值(除根节点),从根节点出发,选择m个节点,问最多的价值是多小. 思路:很明显是树状dp,遍历树时背包最优价值,dp[i][k]=max{dp[i][r]+d ...