正则表达式入门课
涂伟忠
高级研发工程师
24700 人已学习
新⼈⾸单¥59
登录后,你可以任选2讲全文学习
课程目录
已完结/共 18 讲
正则表达式入门课
15
15
1.0x
00:00/00:00
登录|注册

04 | 匹配模式:一次性掌握正则中常见的4种匹配模式

提取网页中的head标签中的内容的正则实现
注释模式
多行匹配模式
点号通配模式
不区分大小写模式
换行和空格的处理
x模式
添加注释
\A, \z, \Z 的区别
匹配每行的开头或结尾
改变 ^ 和 $ 的匹配行为
不支持的情况下的替代方式
替代方式 [\s\S], [\d\D], [\w\W]
匹配任何字符
使用预定义常量指定匹配模式
作用范围
模式修饰符 (?i)
思考题
总结
注释模式(Comment)
多行匹配模式(Multiline)
点号通配模式(Dot All)
不区分大小写模式
一次性掌握正则中常见的4种匹配模式

该思维导图由 AI 生成,仅供参考

你好,我是涂伟忠。今天我们一起来学习正则中的匹配模式(Match Mode)。
所谓匹配模式,指的是正则中一些改变元字符匹配行为的方式,比如匹配时不区分英文字母大小写。常见的匹配模式有 4 种,分别是不区分大小写模式、点号通配模式、多行模式和注释模式。我们今天主要来讲一下这 4 种模式。
需要注意的是,这里的“模式”对应的是英文中的 mode,而不是 pattern。有些地方会把正则表达式 pattern 也翻译成模式,你在网上看到的技术文章中讲的正则模式,有可能指的是正则表达式本身,这一点你需要注意区别。

不区分大小写模式(Case-Insensitive)

首先,我们来看一下不区分大小写模式。它有什么用呢?学一个知识的时候,我一般喜欢先从它的应用出发,这样有时候更能激发我学习的兴趣,也更容易看到学习成果。
下面我来举个例子说明一下。在进行文本匹配时,我们要关心单词本身的意义。比如要查找单词 cat,我们并不需要关心单词是 CAT、Cat,还是 cat。根据之前我们学到的知识,你可能会把正则写成这样:[Cc][Aa][Tt],这样写虽然可以达到目的,但不够直观,如果单词比较长,写起来容易出错,阅读起来也比较困难。
那么有没有更好的办法来实现这个需求呢?这时候不区分大小写模式就派上用场了。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了正则表达式中的四种常见匹配模式:不区分大小写模式、点号通配模式、多行匹配模式和注释模式。不区分大小写模式通过在整个正则表达式前添加模式修饰符 (?i) 实现不区分大小写的匹配。点号通配模式使英文的点(.)可以匹配包括换行在内的任何字符,提高了匹配的灵活性。多行匹配模式改变了 ^ 和 $ 的匹配行为,使其能匹配每行的开头和结尾,适用于处理日志等多行文本的匹配需求。注释模式通过添加注释让正则更易于理解和维护,提高了正则表达式的可读性。文章通过举例和代码演示了每种匹配模式的使用方法和注意事项,帮助读者快速掌握这四种常见的正则表达式匹配模式。文章内容简洁明了,适合技术人员快速了解和掌握正则表达式中的常见匹配模式。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《正则表达式入门课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(65)

  • 最新
  • 精选
  • furuhata
    (?si)<head>(.*)<\/head>

    作者回复: 对的,重要是点要能匹配换行,head不区分大小写

    2020-06-19
    6
    20
  • William
    刊误 JavaScript已经支持单行模式了。支持 gimsuy 共6个flag。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/flags 测试代码:(打开任意一个网站,提取head标签内内容) document.querySelectorAll('html')[0].innerHTML.match(/<head>.*<\/head>/gsi)[0]

    作者回复: 好的,感谢指出,我是在regex101上测试的,发现报错 pattern error,没有细看。 看了您提供的文档,发现 ES2018 新加了这个功能。

    2020-06-23
    14
  • Isaac
    (?si)<head(\s(profile|accesskey|class|contenteditable|contextmenu|data-[\w\d]|dir|draggable|dropzone|hidden|id|lang|spellcheck|style|tabindex|title|translate)(=".*?")?)*>.*<\/head> https://regex101.com/r/x1lg4P/6 (?si)<head(.*?)>.*<\/head> https://regex101.com/r/x1lg4P/5

    作者回复: 还是你厉害,列的这么全

    2020-06-22
    2
    11
  • 张和祥
    (?si)<head>.+<\/head> 顺便问一下,怎么把<head>和</head>这2个过滤掉,就是只取他们直接的内容。

    作者回复: 这个可以后面的在断言里面会讲,下周一就能看到了

    2020-06-20
    4
    7
  • 虹炎
    老师,正则默认是多行匹配吗?我在您提供的链接上测试是。 ^the|cat$ 我不加(?m)也可以匹配到多行!

    作者回复: 看一下后面有没有gm之类的,那个网站可以在后面指定多行模式

    2020-06-19
    3
    4
  • Leoorz
    课后练习题: (?is)<head>.*<\/head> 在将多行视作单行匹配相关内容,采用单行模式

    作者回复: 单行模式的意思是 点匹配所有(包括换行)。 不过你说的“将多行视为单行”好像有那么点意思。 正则没问题,可以继续考虑下 head 中有属性的情况。 比如 <head id="my-head">xxxx</head> 你这个正则还能继续工作不?

    2020-06-19
    3
  • 盘胧
    老师,((?i)(cat))和((?i)cat)两个规则是不一样的吧……你咋说一样的。应该是这里结果凑巧?

    作者回复: 一样是指效果一样,前面一个正则只是cat部分多了子组,由于我们只用了第一个子组,对功能没影响,但效率后面的好一些

    2020-06-19
    2
  • 王九日
    (?i)<head>(?s)(.*)(\/head) 老师您好,这个结果会匹配上一个换行,这个能去掉吗?

    作者回复: 可以通过子组的方式,把需要的部分括起来,换行放到括号外面就好了。另外可以提取后再把换行去了,也不一定非得用一个正则完成所有事情。

    2020-06-27
    1
  • seerjk
    v1: <(?:(?i)head)>(?#case insensitive <head>)((?s).+)(?#match \n)<\/(?:(?i)head)>(?#case insensitive </head>) v1版本比较复杂,从做向右考虑:<(?:(?i)head)> 匹配不区分大小写的 <head> 并不保存分组;((?s).+) 点号通配模式,匹配换行;<\/(?:(?i)head)> 匹配不区分大小写的 <\head> 并不保存分组; v2: (?is)<head>(?#case insensitive <head>)(.+)(?#match \n)<\/head>(?#case insensitive </head>) 优化后把匹配模式(?i) 和 (?s) 合并提前到表达式最前面(?is)(匹配模式对整个表达式生效),且调整后不会影响结果。

    作者回复: 赞,思路清晰

    2020-06-21
    2
    1
  • KaKa
    老师能不能多讲解下 实际应用啊 好比我是前端,更主要关注的是js方面的。可是听了几节你将的课以后,还是不知道如何在js中使用。也仅仅只会在你给的一个专门链接里进行测试。可是在js中呢 真的是一脸懵逼。可能是我太菜了[旺柴],也正是因为我菜 所以我才买了这门课程 哈哈哈哈, 麻烦老师回我一下啊

    作者回复: 先不要纠结具体的编程语言,要摆脱了字符的限制,深⼊到概念思维的层⾯。掌握了里面的各种概念之后,具体怎么写查一查文档,你肯定能表示出来。 文章中给出的链接,在练习的时候,页面左侧有 FLAVOR,ECMASCript(JavaScript),你可以切换成这个去练习。

    2020-06-20
    3
    1
收起评论
显示
设置
留言
65
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部