iOS开发中正则表达式的基础使用

正则表达式?什么是正则表达式?
百度百科给出的解释是这样的:正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串
根据我的学习,我理解的正则表达式是:一个字符串,这个字符串用来描述我们所制定的规则。

学习正则表达式,就好像学习一门新的语言,只是这种语言是用来制定规则的。学习一门新语言,我们一般从helloworld开始。
例如我们在要一个很长的字符串中找到hellowrold,那么我们就可以使用正则表达式 helloworld 。helloworld这个正则表达式是最简单类型的正则表达式了,它会匹配这样的字符串:按着helloworld这样的顺序排列的字符串。

这里介绍一下正则表达式中的一些特殊代码,也叫做元字符(metacharacter)。在我看来,这些元字符类似我们OC语言中的关键字。(当然正则表达式的与字符肯定不止这么点,但一下的我觉得已经够我们开发使用的了)

\b:代表着单词的开头或结尾,作为单词的分界处。
例如:正则表达式 h i会匹配到包含有 hi 这两个连续字母的单词,像history、him。而如果加上\b,是正则表达式变成这样 \bhi\b那么就只会匹配到 hi 这个单词

. (英语中的句号): 匹配除了换行符以外的任意字符。
例如:正则表达式 \ba.\b(\b是代表单词开头或结束的元字符,上面已经介绍) 匹配以 前面一个是字符a,后面是一个除换行符意外的任意字符的字符串,像aa、ab、a_、a+ 这些都可以匹配到

\d:匹配一个数字(0-9)
例如:正则表达式 0\d\d\d\d\9 匹配以0开都,以9结尾的一串6个数字的数字串,中间的四个数字可以是0到9中任意的数字,像056789、043629等等

\w:匹配字母或数字或下划线或汉字
例如:正则表达式 \w\w\w\w 匹配任意的四个字母或数字或下划线或汉字,像中文中的成语:十动然拒、普大喜奔 这种类型的,或者是:main、void 这种四个字母的单词,或者是:5_a、壕b6 这种杂交的类型

\s:匹配任意的空白字符(上面说了这么多,这个没什么好说的了,应该挺好理解的把)

ps:上面的介绍的元字符是用来匹配特殊的格式或者字符的,而下面的几个则用来匹配数量的

*(星号) :重复零次或多次
例如:正则表达式 a\d
匹配以字符a开头的,后面跟着0个或者多个数字的字符串:a、a1、a94803748 这些都是该正则表达式匹配的字符串;

+:重复1次或多次
例如:正则表达式 a\d+ 匹配的是以字符a开头的,后面跟着1个或多个数字的字符串:a3、a5856306 ,但是不能匹配 a 应为+代表最少要有一个;

?:重复0次或1次
和上面两个类似,表达式 a\d? 匹配的是以字符a开头的,后面跟着0个或一个数字的字符串:a、a5、a9

{n}:重复n次
例如:我们的身份证号,一般来说是18位的数字(实际上身份证的验证要复杂得多,这里只是举个栗子),那么我们可以写这么一个正则表达式来匹配它:\d{18} ,又例如我们银行卡的取款密码,一般来说是6位的数字,那么我们就可以写:\d{6} 这样的正则表达式来匹配。

{n,}:重复n次或更多次(即最少都要重复n次)
例如:现在很多网站的账号注册时,密码都要求不少于多少个数,那么我们就可以这么写:\d{6,} ,这是不少于6位的数字

{n,m}:重复n到m次(最少重复n次,最多重复m次)
例如:QQ的账号要求是5到12位, 那么可以用正则表达式:\d{5,12} 来匹配

好了,以上介绍到得元字符基本上可以满足我们开发要求了。

接着还有几点是要注意的:
[]的使用:
[abcdef] 这个正则表达式匹配abcdef中其中一个字母,[.?!]这个正则表达式匹配里面三个标点符号中的其中一个。我们也可以用来指定一个范围,[0-9]匹配0到9这段区间中任意一个数字(包括0和9)。[a-z]这里就是匹配a到z这段区间其中一个字母。我们还可以这几个范围连在一起使用,比如[0-9a-zA-Z]就是匹配 0到9、a到z、A到Z 这三个区间的其中一个区间的其中一个字符或数字。

分支条件:有时候,当我们要制定的规则有多种形式的时候,所以我们需要一个“或”符号来连接两种形式。
举个栗子:我们的电话号码可以用两种形式表示:020-88888888 (020)88888888。要让让这两种形式的写法都可以匹配,我们就要写两种形式的正则表达式,匹配020-88888888 的正则表达式可以写为:0\d{2}-\d{8};匹配(020)88888888的正则表达式我们可以写成:(0\d{2})\d{8}。如果要使这两个正则表达式一起匹配一个字符串,那么就要用到“或”符号来连接他们了:0\d{2}-\d{8}|(0\d{2})\d{8} 。
ps:其他语言我不是很清楚,但是OC中“|”运算符是判断前面一个表达式,如果前面一个表达式是“true”的话,后面的运算就不会继续进行下去了,而正则表达式的“|”运算符也是一样的,只要前面的表达式是ture得话,就不会继续判断下面的运算了。比如说:\d{3}|\d{3}-\d{4} 这个正则表达式,因为前面的\d{3}部分和后面\d{3}部分一样,当字符串 111-11匹配时候只会匹配到前面的三位,后面的“-11”都是匹配不到的。如果你还没有打算向iOS以外的方向发展,我建议这个作为了解就好了。

分组:
这个比较容易,就是用圆括号对“()”将其中某些语句括起来作为一个整体。
例如:[a-zA-Z0-9]+@[a-zA-Z0-9]+(.[a-zA-Z0-9]{2,4}){1,2} 这个是一个不完善的邮箱匹配的正则表达式,式子后面部分“(.[a-zA-Z0-9]{2,4}){1,2}” 可以看到,圆括号括起来的部分“.[a-zA-Z0-9]{2,4})”这里表示他们是一个整体,后面的“{1,2}”重复1或者两次,是相对于圆括号这个整体来说的。整个正则表达式匹配像这样的邮箱:abc12345@qq.com 或者匹配这样的:980a@126.com.cn 这样的邮箱(虽然我不知道这个邮箱后缀是否存在,但是这些都不是重点)。

到这里,我们可以来看2个例子,印证一下上面所讲的东西:---------------------------------
(\d{1,3}.){3}\d{1,3}:是一个简单的IP地址匹配表达式。要理解这个表达式,请按下列顺序分析它:\d{1,3}匹配1到3位的数字,(\d{1,3}.){3}匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字(\d{1,3})。(这个正则表达式其实并不准确,准确的IP地址描述是这样的:((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?))

(?0\d{2})?[- ]?\d{8}|0\d{2}[- ]?\d{8}这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔。
如果上面两个例子,你可以自己分析出来,那么基本上够了。如果你想了解更多的有关正则表达式的知识,这里已经帮不到你了,但是度娘肯定对你有帮助。http://www.jb51.net/tools/zhengze.html 而我自己的话是在这个网址了解的,有兴趣可以去看一下。
最后差点忘了,还有一点:字符转移的
如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用.和*。当然,要查找\本身,你也得用\.
例如:deerchao.net匹配deerchao.net,C:\Windows匹配C:\Windows。
====================华丽的分割线=======================割割割==========
好了,说了这么多,都是正则表达式的内用,那么接下来我们还是看一下在Xcode中使这些正则表达式为我所用呢
首先介绍一下我的运行环境: 硬件:mac笔记本 系统:OS X Yosemite 10.10.4 软件:Xcode6.4
为了方便查看,我布局了一个页面:(这次我用QQ号的正则表达式来做测试)

iOS开发中正则表达式的基础使用 - 浪奇八宝粥 - I can see

布局代码我相信大家都会写,所以这里就不贴了 。下面是点击蓝色button的监听事件的代码:

pragma mark - 监听btn的点击事件

- (void)btnOnClick
{
    //将正则表达式作为字符串赋值给变量regex
    NSString *regex = @"\\d{5,12}";

    //根据正则表达式将NSPredicate的格式设置好
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

    //判断正则表达式能否正确匹配_textFiedld.text的内容
    BOOL isMatch = [pred evaluateWithObject:_textField.text];

    //显示匹配结果
    if (isMatch) {
        _lab.text = @"匹配成功";
    } else {
        _lab.text = @"匹配失败";
    }
}

运行结果如下:


iOS开发中正则表达式的基础使用 - 浪奇八宝粥 - I can see
iOS开发中正则表达式的基础使用 - 浪奇八宝粥 - I can see

[图片上传中。。。(4)]

截图中已经给出了解释,能不能理解就见仁见智了!

文章到此就进入尾声了,以上所有只是个人学习的理解,如果有错,还望指正!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容