专栏名称: Cocoa开发者社区
CocoaChina苹果开发中文社区官方微信,提供教程资源、app推广营销、招聘、外包及培训信息、各类沙龙交流活动以及更多开发者服务。
目录
相关文章推荐
花果科技  ·  iOS 18.4 ... ·  3 天前  
花果科技  ·  iOS 18.4 ... ·  3 天前  
51好读  ›  专栏  ›  Cocoa开发者社区

系统地学习正则表达式(一):基础篇

Cocoa开发者社区  · 公众号  · ios  · 2016-09-27 08:01

正文

▲点击上方“ CocoaChina ”关注即可免费学习iOS开发


文/iOS_小松哥(简书作者)
原文链接:http://www.jianshu.com/p/ac2596be9606


什么是正则表达式


正则表达式就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,用来表达对字符串的一种过滤逻辑。


通过正则表达式可以达到如下的目的:


  1. 给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配”);

  2. 可以通过正则表达式,从字符串中获取我们想要的特定部分。


下面开始讲解正则表达式各种规则:


匹配普通文本字符


正则表达式可以只包含普通的文本,代表去精确匹配这个文本。例如:


正则表达式:song
待匹配文本:xiaosongge,xiaoSongge
匹配后结果:xiaosongge,xiaoSongge


正则表达式默认是区分大小写的,所以song不会匹配 "Song" 。但是大部分的正则表达式实现都提供了一个选项表示不区分大小写。


匹配任意字符


.用来匹配一个任意字符,例如:


正则表达式:c.t
待匹配文本:cat cet caaat dog
匹配后结果:cat cet caaat dog


分析:c.t会匹配以" c "开头,以" t "结尾,中间为任意字符的字符串。


同理,多个连续的.可以匹配多个连续的任意字符:


正则表达式:c..t
待匹配文本:cat cet caat dog
匹配后结果:cat cet caat dog


匹配特殊字符


.在正则表达式中含有特殊的意义,是一个特殊的字符。\也是特殊字符,可以对特殊字符起到转义作用。如果你想匹配的是一个真正的" . "字符,需要在.前面加上\对字符进行转义。所以,\.表示真正的" . "字符。


正则表达式:c\.t
待匹配文本:cat c.t dog
匹配后结果:cat c.t dog


注意:因为\也是特殊字符,所以想要匹配一个真正的" \ "字符,需要使用两个反斜线\\:


正则表达式:c\\t
待匹配文本:cat c\t dog
匹配后结果:cat c\t dog


使用字符集合


上面说到.能匹配一个任意字符,但是如果我想匹配几个特定字符怎么办?匹配一组特定的字符可以使用[和]元字符。


正则表达式:c[ab]t
待匹配文本:cat cbt cet
匹配后结果:cat cbt cet


分析:[ab]会匹配" a "或者" b "。所以c[ab]t会匹配" cat "和" cbt "而不会匹配" cet "。


使用字符组区间


在上面的例子中,假如我想匹配cet怎么办,在[]里面多加一个吗?那如果我想匹配任意小写字母呢,往里面写几十个吗?虽然是可以的,但是太长了。这里我们可以用到[a-z]:


正则表达式:c[a-z]t
待匹配文本:cat cbt czt c2t
匹配后结果:cat cbt czt c2t


分析:c[a-z]t表示以" c "开头," t "结尾,中间为字母 " a " - " z " 的任意一个字母。


类似的区间还有:


  • [0-9] 和[0123456789]的功能一样。匹配所有的数字。

  • [A-F] 匹配A到F的大写字符。

  • [A-Z] 匹配所有的 A 到 Z 的大写字符。

  • [a-z] 匹配所有的 a 到 z 的小写字符。

  • [A-z] 匹配从 ASCII A 到 ASCII z 的所有字符(不仅仅匹配所有字母,还匹配在 ASCII 表中 A 到 z 中的字符,如 [ 和 ^ 等)。

  • [A-Za-z0-9] 匹配所有的大小写字母和数字。


非字符集的匹配


字符集合一般用于指定一组需要匹配的字符。但是有些时候,你想要排除一组你不想匹配的字符。可以通过对于字符集合的否定来实现。例如:


正则表达式:c[^a-z]t
待匹配文本:cat cbt czt c2t cAt
匹配后结果:cat cbt czt c2t cAt


分析:这个和前面一个例子完全相反。[a-z] 匹配所有的小写字母,而 [^a-z] 匹配所有的不是小写字母的字符。


注意,^字符是将字符集合中的所有字符都取消匹配。


元字符


元字符在正则表达式中有特殊的意义,上面我们已经说了几个元字符,比如.、[和]。这些字符不能直接表示自己的含义,例如,不能直接使用[来匹配" [ ",使用.来匹配" . "。


所有的元字符都可以在前面加上反斜线转义,当转义后,字符将匹配自身而不是其特殊含义。例如,\[将匹配" [ ":


正则表达式:a\[b
待匹配文本:a[b ab a[[b
匹配后结果:a[b ab a[[b


注意:\用来转义元字符,这也意味着\也是一个元字符。所以如果需要匹配真正的" \ ",可以使用\\:


正则表达式:a\b
待匹配文本:a\b a\b a[[b
匹配后结果:a\b a\b a[[b


空白字符


有时候你可能需要匹配文本中不能打印的空白字符。例如,你希望能够找到所有的 Tab 字符,或者是所有的换行符。你可以使用下表中的特殊元字符:


元字符 描述
[\b] 退格符
\f 换页符
\n 换行
\r 回车
\t 制表符
\v 垂直制表符


例如\r\n将匹配一个回车换行组合,在 Windows 中表示一个文件换行。在 Linux 和 Unix 系统中,只需要使用\n即可。


匹配特定 的字符类型


有一些特殊的元字符可以用来匹配常用的字符集合。这些元字符被称为匹配字符类。你会发现使用它们是很方便的。


匹配数字或者非数字


上面说到,[0-9] 可以匹配所有的数字。如果不想匹配任何数字,则可以使用[^0-9]。下表中列出了数字和非数字的类元字符:



元字符 描述
\d 任何数字 (同 [0-9])
\D 任何非数字 (同 [^0-9])


正则表达式:c\dt
待匹配文本:cat c2t czt c9t
匹配后结果:cat c2t czt c9t

正则表达式:c\Dt
待匹配文本:cat c2t czt c9t
匹配后结果:cat c2t czt c9t


匹配字母字符和非字母字符


另外一个常用的类元字符是\w和\W:



元字符 描述
\w 所有的文字数字式字符:大小写字母、数字和下划线 (同 [a-zA-Z0-9_])
\W (同 [^a-zA-Z0-9_])


正则表达式:c\wt
待匹配文本:cat c2t czt c-t c\t
匹配后结果:cat c2t c-t c\t

正则表达式:c\Wt
待匹配文本:cat c2t c-t c\t
匹配后结果:cat c2t c-t c\t


匹配空白和非空白


最后一个将要遇到的匹配类是空白类:



元字符 描述
\s 所有的空白字符 (同 [\f\n\r\t\v])
\S 所有的非空白字符 (同 [^\f\n\r\t\v])


正则表达式:c\st
待匹配文本:cat c t c2t c\t
匹配后结果:cat c t c2t c\t

正则表达式:c\St
待匹配文本:cat c t c2t c\t
匹配后结果:cat c t c2t c\t


匹配一个或者更多字符


+元字符表示匹配一个或者多个字符。例如,a将匹配"a",而a+则匹配一个或者多个"a"。


正则表达式:cat
待匹配文本:ct cat caat caaat
匹配后结果:ct cat caat caaat







请到「今天看啥」查看全文