iOS中使用正则表达式NSRegularExpression来验证textfiled输入的内容分析.doc

iOS中使用正则表达式NSRegularExpression来验证textfiled输入的内容分析.doc

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
iOS中使用正则表达式NSRegularExpression来验证textfiled输入的内容分析

正则表达式之 贪婪与非贪婪模式详解 1 概述 贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。 属于贪婪模式的量词,也叫做匹配优先量词,包括: “{m,n}”、“{m,}”、“?”、“*”和“+”。 在一些使用NFA引擎的语言中,在匹配优先量词后加上“?”,即变成属于非贪婪模式的量词,也叫做忽略优先量词,包括: “{m,n}?”、“{m,}?”、“??”、“*?”和“+?”。 从正则语法的角度来讲,被匹配优先量词修饰的子表达式使用的就是贪婪模式,如“(Expression)+”;被忽略优先量词修饰的子表达式使用的就是非贪婪模式,如“(Expression)+?”。 对于贪婪模式,各种文档的叫法基本一致,但是对于非贪婪模式,有的叫懒惰模式或惰性模式,有的叫勉强模式,其实叫什么无所谓,只要掌握原理和用法,能够运用自如也就是了。个人习惯使用贪婪与非贪婪的叫法,所以文中都会使用这种叫法进行介绍。 2 贪婪与非贪婪模式匹配原理 对于贪婪与非贪婪模式,可以从应用和原理两个角度进行理解,但如果想真正掌握,还是要从匹配原理来理解的。 先从应用的角度,回答一下“什么是贪婪与非贪婪模式?” 2.1 从应用角度分析贪婪与非贪婪模式 2.1.1 什么是贪婪与非贪婪模式 先看一个例子 举例: 源字符串:aadivtest1/divbbdivtest2/divcc 正则表达式一:div.*/div 匹配结果一:divtest1/divbbdivtest2/div 正则表达式二:div.*?/div 匹配结果二:divtest1/div(这里指的是一次匹配结果,所以没包括divtest2/div) 根据上面的例子,从匹配行为上分析一下,什是贪婪与非贪婪模式。 正则表达式一采用的是贪婪模式,在匹配到第一个“/div”时已经可以使整个表达式匹配成功,但是由于采用的是贪婪模式,所以仍然要向右尝试匹配,查看是否还有更长的可以成功匹配的子串,匹配到第二个“/div”后,向右再没有可以成功匹配的子串,匹配结束,匹配结果为“divtest1/divbbdivtest2/div”。当然,实际的匹配过程并不是这样的,后面的匹配原理会详细介绍。 仅从应用角度分析,可以这样认为,贪婪模式,就是在整个表达式匹配成功的前提下,尽可能多的匹配,也就是所谓的“贪婪”,通俗点讲,就是看到想要的,有多少就捡多少,除非再也没有想要的了。 正则表达式二采用的是非贪婪模式,在匹配到第一个“/div”时使整个表达式匹配成功,由于采用的是非贪婪模式,所以结束匹配,不再向右尝试,匹配结果为“divtest1/div”。 仅从应用角度分析,可以这样认为,非贪婪模式,就是在整个表达式匹配成功的前提下,尽可能少的匹配,也就是所谓的“非贪婪”,通俗点讲,就是找到一个想要的捡起来就行了,至于还有没有没捡的就不管了。 2.1.2 关于前提条件的说明 在上面从应用角度分析贪婪与非贪婪模式时,一直提到的一个前提条件就是“整个表达式匹配成功”,为什么要强调这个前提,我们看下下面的例子。 正则表达式三:div.*/divbb 匹配结果三:divtest1/divbb 修饰“.”的仍然是匹配优先量词“*”,所以这里还是贪婪模式,前面的“div.*/div”仍然可以匹配到“divtest1/divbbdivtest2/div”,但是由于后面的“bb”无法匹配成功,这时“div.*/div”必须让出已匹配的“bbdivtest2/div”,以使整个表达式匹配成功。这时整个表达式匹配的结果为“divtest1/divbb”,“div.*/div”匹配的内容为“divtest1/div”。可以看到,在“整个表达式匹配成功”的前提下,贪婪模式才真正的影响着子表达式的匹配行为,如果整个表达式匹配失败,贪婪模式只会影响匹配过程,对匹配结果的影响无从谈起。 非贪婪模式也存在同样的问题,来看下面的例子。 正则表达式四:div.*?/divcc 匹配结果四:divtest1/divbbdivtest2/divcc 这里采用的是非贪婪模式,前面的“div.*?/div”仍然是匹配到“divtest1/div”为止,此时后面的“cc”无法匹配成功,要求“div.*?/div”必须继续向右尝试匹配,直到匹配内容为“divtest1/divbbdivtest2/div”时,后面的“cc”才能匹配成功,整个表达式匹配成功,匹配的内容为“divtest1/divbbdivtest2

文档评论(0)

wbjsn + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档