美文网首页我的iOS开发小屋iOS Swift && Objective-C
【图片+例子】学习正则表达式

【图片+例子】学习正则表达式

作者: Lefe | 来源:发表于2017-10-24 19:54 被阅读176次

【 通过例子学习正则表达式 Day1 】

【例一】找出以 lefelefe_x 单词开头,以 wsy 结尾的字符串。比如:lefe name is wsy 是合法的,而 lef name is wsy 是非法的。
【正则表达式为】
"(^(?:lefe|lefe_x)\b.{0,}wsy$)"

4.jpg
  • ^表示从字符串的开始位置匹配,^(?:lefe|lefe_x) 表示以 lefe 或者 lefe_x开头;
  • | 表示或,比如 A | B | C ,表示 A,B 和 C 中任意一个;
  • () 表示一个组,(?:) 表示不捕获这个分组;
  • \b 表示匹配一个单词的边界,在这里只能匹配 lefelefe_x;
  • 匹配字符串的开头和结尾后,基本上完成了题目的要求,但是字符串lefe(lefe_x)和wsy之间可以是任意字符,. 表示匹配任意字符(不包含换行符),{0,}表示匹配0个或多个字符,则.{0,} 表示匹配0个或多个任意字符(不包含换行符);
  • $表示从字符串的结尾处开始匹配,wsy$ 则表示以 wsy 结尾。

【 知识点 】

  • 字符边界^$\b 表示字符的边界,^ 匹配字符串的开头,$匹配字符串的结尾,\b匹配单词的边界,如:lefe\b 可以匹配 lefe ,但不可匹配 lefe_x
  • 量词
    {m} 只出现 m 次,lefe{2} 只能匹配 lefee
    {m,n} 出现 m 到 n 次
    {m,} 至少出现 m 次
  • 选择表达式
    比如 lefe | Lefe_x | Lefe ,表示 lefe,Lefe_x 和 Lefe 中任意一个
  • 分组
    以括号括起来的字符集为一个分组,在 ( 添加 ?: 将忽略这个分组
  • 字符集
    . 匹配除换行符以外的任意一个字符
    \w = [0-9a-zA-Z_]
    \W = [^0-9a-zA-Z_]
    \s = [\t\n\v]
    \S = [^\t\n\v]
    \d = [0-9]
    \D = [^0-9]

【 通过例子学习正则表达式 Day2 】

正则表达式对于每一种语言来说都十分重要,然而很多同学可能仍然停留在复制粘贴中。其实学好正则表达式有时非常必要,起码可以阅读它,更好的情况是能够书写它。本文主要通过【例子+图片】的方式来学习它,旨在能够让每位朋友更轻松的学习,在几天的学习结束后会给大家一个总结。

【例子2】匹配以 lefe 开头,lefe 后面不能紧跟_x,后面由数字,-,_和字母组成,且不包含l,e,f 三个字母中的任意一个(至少一位),且为最短的用户名。

【分析】
根据要求可以把题目拆分成:
1.以 lefe 开头,不能为 lefe_x。可以转换成 ^lefe(?!_x);
2.中间部分由数字,-,_和字母组成,不能包含 l,e,f,至少一位。可以转换成 [0-9a-dg-km-zA-DG-KM-Z_-]+;
3.匹配最短的。在正则表达式中用到了贪婪与非贪婪的概念,使用 ?;

【正则表达式】
'^(lefe(?!x)(?:[0-9a-dg-km-zA-DG-KM-Z-]+?))'

2.png

【知识点】

  • 1.非获取匹配
    lefe(?=_x) ,lefe 后面紧跟着 _x,正向肯定预查
    lefe(?!_x) ,lefe 后面不能出现 _x,正向否的定预查
    (?<!lefe)_x ,_x 前面不能为 lefe,反向肯定预查
    (?<=lefe)_x ,_x 前面为 lefe,反向否的定预查
  • 2.字符集合
    [xyz] 匹配 x,y,z 任意一个字符;
    [^xyz] 匹配除 x,y,z 外的任意一个字符;
    [a-z] 匹配 a-z 中任意一个字符;
  • 3.贪婪匹配与非贪婪匹配
    默认的匹配规则为非贪婪匹配,使用 ? 使贪婪匹配变为非贪婪匹配。比如:使用正则表达式lefe{2,} 匹配 lefeeeeeeee,如果为贪婪匹配(lefe{2,})时将匹配 lefeeeeeeee,为非贪婪匹配(lefe{2,}?)时,将匹配 lefee
  • 4.量词 *+?
    'lefe*' ,lef 后有0个或多个e
    'lefe+' ,lef 后有1个或多个e
    'lefe?' ,lef 后有0个或1个e

【 通过例子学习正则表达式 Day3 】

【例3】匹配由数字和字母组成的 6-16 位字符串。
【分析】

  • 数字和字母组成,可以表示为:[0-9a-zA-Z];
  • 6-16位字符,可以表示为{6,16};
  • 由数字和字母组成,则不能为纯数字和纯字母组成的。
    【正则表达式】
    ’^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$‘
3.png

【解析】
?!在【例2】中已说明,(?![0-9]+$) 不能为纯数字,(?![a-zA-Z]+$) 不能纯字母。

【例4】匹配 html 标签,比如 <body>Hello lefe</body>。
【分析】
html 标签为成对出现的,比如<body></body>,<title><title>
【正则表达式】
^<([a-z]+)>.*<\/\1>

1.png
【知识点】
\数字:表示引用分组,\1 表示匹配分组1

【 通过例子学习正则表达式 最后一天 】

如果你跟着前3天的学习,基本上已经掌握了正则表达式,不过需要多加练习,这样会理解更加深刻。前几天的例子都是通过 Python 验证的,在 iOS 中正则表达式的实现可能与 Python 有少许不同。今天主要总结各个字符代表的含义:

  • ^: 从字符串开始位置匹配,^lefe:以 lefe 开头的文本;
  • $: 从字符串的结尾匹配,$lefe:以 lefe 结尾的文本;
  • *: 匹配0个或多个字符,lefe*:lef 后出现0个或多个e,lef,lefeeee 合法;
  • +: 匹配1个或多个字符,lefe+:lef 后出现1个或多个e,lefe,lefeeee 合法;
  • ?: 匹配0个或者1个字符,lefe?:lef 后出现0个或1个e,lef,lefe 合法;
  • {m}: 匹配 m 次,lefe{2}: lefe 后出现 1 个 e,lefee 合法;
  • {m,}: 匹配至少 m 次,lefe{2,}: lefe 后至少出现 1 个 e,lefee,lefeee 合法;
  • {m,n}: 匹配 m dao n 次,lefe{2,3}: lefe 后出现 1 个 或者 2 个 e,lefee,lefeee 合法;
  • \d: 匹配任意0-9的数字,比如:123,23;
  • \D: 与 \d 相反,匹配不是0-9的字符,比如:lefe;
  • \w: 匹配任何数字和字母,还有下划线,比如:lefe_x;
  • \W: 与 \w 相反;
  • \s: 匹配任何空格字符,与 [\n\t\r\f] 相同;
  • \S: 与 \s 相反;
  • \b: 匹配单词边界,比如使用正则表达式'\w*\b' 匹配 'lefe_x is wsy',将匹配到 lefe_x,is 和 wsy;
  • \B: 与 \b 相反;
  • [字符]: 匹配[]中的任意单个字符,比如[lefx] 匹配 l,e,f 和 x 中的任意一个字符;
  • [^字符]: 匹配除[]中的任意单个字符,比如[lefx] 匹配除了 l,e,f 和 x 的任意字符;
  • [a-z]: 匹配 a 到 z 任意字母;
  • A|B|C: 只能匹配 A,B 和 C 的任意一个,lefe|lefe_x|wsy 匹配 lefe 或 lefe_x 或 wsy;
  • .: 匹配除 \n,\r 任何单个字符;
  • (): 分组,可以获取分组中的内容,比如:'\[UIImage imageNamed:@"(.+?)"',匹配 [UIImage imageNamed:@"lefe"] 可以从匹配结果中获取到图片的名字 lefe;
  • \数字:引用分组,比如:^<([a-z]+)>.*<\/\1>' 可以匹配<body>hello lefe</body>`
  • (?:): 非获取匹配,在匹配结果中将忽略这个分组;
  • (?=): 非获取匹配,正向肯定预查,正则表达式'window(?=98|95|2000)' 可以匹配 window98window95window2000 中的 window
  • (?!): 非获取匹配,正向否定预查,正则表达式'window(?!98|95|2000)' 可以匹配window2007 中的 window, 不可以匹配 window98window95window2000 中的 window
  • (?<=): 非获取匹配,反向肯定预查,正则表达式'(?<=98|95|2000)window' 可以匹配 98window95window2000window 中的 window
  • (?<!): 非获取匹配,反向否定预查,正则表达式'(?<!98|95|2000)window' 可以匹配2007window 中的 window, 不可以匹配 98window95window2000window 中的 window

最后给大家推荐一个 可视化正则表达式网站

推荐阅读

【iOS 国际化】如何把国际化时需要3天的工作量缩减到10分钟

===== 我是有底线的 ======
喜欢我的文章,欢迎关注我的新浪微博 Lefe_x,我会不定期的分享一些开发技巧

相关文章

  • 【图片+例子】学习正则表达式

    【 通过例子学习正则表达式 Day1 】 【例一】找出以 lefe 或 lefe_x 单词开头,以 wsy 结尾的...

  • 正则表达式的语法分类

    转载自正则表达式30分钟入门教程 入门 学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子进行修改,实...

  • 【shell笔记>实战】正则表达式实战

    这里演示shell脚本中常见的一些正则表达式例子。如果你对正则表达式不理解,先阅读学习正则表达式一文。 目录文件计...

  • python 正则表达式

    最近在做毕设,需要学习一下正则表达式 正则表达式的基本语法: 那么什么叫做非贪婪(尽可能少匹配字符)呢?举个例子:...

  • iOS 正则表达式

    正则表达式学习 语法 ^ 和 $ 表示字符串的结束 1、 例子:^one 表示one开头的字符串 “one ......

  • Mysql入门(命令行)--正则表达式

    匹配正则表达式使用 regexp 关键字 例子:

  • Python正则表达式分组 Group

    在正则表达式介绍中,我们学习了正则表达式的基本用法。列举了一些简单的例子。在这一部分,将介绍更高级的用法,捕获分组...

  • 正则表达式学习笔记

    正则表达式学习(js) 概览 先拿数字举例 几个常用的例子 单词边界\b比如我们就像匹配单词is,像qishi这样...

  • iOS---给图片添加手势

    例子一 给图片添加事件 方法 例子二 给图片添加手势 方法

  • python正则表达式(一):规则

    最近几天在学习正则表达式,大概思路是先了解规则,再学习re库方法,最后就可以找例子运用总结啦~ 1. 规则 1.1...

网友评论

    本文标题:【图片+例子】学习正则表达式

    本文链接:https://www.haomeiwen.com/subject/bxenuxtx.html