0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是正则表达式?正则表达式如何工作?哪些语法规则适用正则表达式?

OSC开源社区 来源:OSC开源社区 2023-11-03 14:41 次阅读

正则表达式又称规则表达式(Regular Expression,在代码中常简写为 regex、regexp 或 RE),是一种用于匹配、查找、替换文本的强大工具。它能够以特定的模式匹配字符串,从而实现自动化文本处理。在许多编程语言中,正则表达式都被广泛用于文本处理、数据分析、网页抓取等领域。通过正则表达式,我们可以精确地筛选、操作和格式化文本,提高工作效率。

正则表达式在日常生活中有着广泛的应用。比如,在处理电话号码时,我们可以使用正则表达式来验证号码的格式是否正确。中国的电话号码通常由11位数字组成,第一位为1,第二位通常为3-9,我们可以使用以下正则表达式来匹配这些号码:

/^1[3-9]d{9}$/

通过这个正则表达式,我们可以判断一个电话号码是否符合规范,从而避免出现错误的信息输入。

什么是正则表达式

每个正则表达式都有一个有限自动机(也称为状态机),它接受表达式指定的语言,并使用 Thompson 构造算法将正则表达式转化为一个与之等价的非确定有限状态自动机(NFA)。同时,对于每个有限自动机来说,还有一个描述该自动机所接受语言的正则表达式。该表达式可以通过克莱恩算法或高斯消元法生成。

正则表达式的一个著名应用是文本编辑器中的搜索和替换功能,计算机先驱 Ken Thompson( UNIX 操作系统开发者之一)首先在 20 世纪 60 年代的面向行编辑器 QED 中实现了该功能。此函数允许查找文本中的特定字符串,并根据需要将其替换为任何其他字符串。

正则表达式如何工作

正则表达式可以仅使用正则字符(例如 abc ),也可以使用正则字符和元字符的组合(例如 ab*c)。元字符的任务是描述某些字符的结构或排列,例如字符是否应位于行的开头,或者字符是否只出现一次或多次出现。上面提到的正则表达式示例的工作原理如下:

abc:简单的正则表达式模式 abc 需要完全匹配。换句话说,该表达式以精确的顺序搜索包含字符 “abc” 的所有字符串。例如可以匹配到:“a abc d” 及 “abc oulomb”。

ab*c:相比之下,具有特殊字符的正则表达式略有不同。星号代表表达式搜索以字母 “a” 开头并以字母 “c” 结尾的字符串。但是,a 和 c 之间可以有任意数量的 b。所以,“abc” 以及字符串 “abbbbc” 和 “cbb abbc ba” 也构成了匹配。

ba1cf79a-796e-11ee-939d-92fbcf53809c.png

每个正则表达式还可以链接到特定的操作,例如上面提到的 “替换” 操作。只要正则表达式为真,即只要存在上面示例中所述的匹配项,就会执行此操作。又拍云 CDN 的边缘规则中就支持类似场景,根据正则表达式匹配字符串,执行改写、跳转、访问控制、限速等需求。

ba4c91c6-796e-11ee-939d-92fbcf53809c.png

使用正则表达式的挑战

掌握正则表达式可以提高我们编程和文本处理的能力,更加高效地处理大量数据和文本。然而,掌握和使用还是存在着一些挑战。

复杂性:正则表达式本身较为复杂,学习曲线陡峭,编写和理解复杂的正则表达式可能需要大量的时间和经验。

匹配效率:不合理的正则表达式可能导致效率低下,特别是在处理大量数据时。

不可读性:复杂的正则表达式可能难以理解,使得维护和调试变得困难。

学习成本:正则表达式的语法和特殊字符较多,需要一定的学习才能熟练使用。

编写正则表达式时,最重要的是掌握以下几个核心概念:

元字符:包括字符、反斜杠、方括号、星号、问号等,它们用于匹配特定的字符或字符集。

转义字符:使用反斜杠对特殊字符进行转义,以便匹配这些字符本身而不是其特殊含义。

限定符:用于指定正则表达式中前一个字符或子表达式出现的次数。例如,* 表示零次或多次,+ 表示一次或多次,? 表示零次或一次。

选择符:使用管道符号(|)表示可以选择多个模式中的任何一个进行匹配。

原子:用于指定一个精确的字符或字符集,例如 d 表示数字字符,w 表示字母、数字或下划线字符。

断言:用于指定一个位置而不是具体的字符或字符集,例如 ^ 表示行首,$ 表示行尾。

括号:用于将多个模式组合成一个更复杂的模式,并指定匹配的顺序。

掌握了这些核心概念,就能够编写更准确、更复杂的正则表达式,以解决各种文本处理问题。

哪些语法规则适用正则表达式

正则表达式可以在多种语言中使用,例如 Perl、Python、Ruby、JavaScript、XML 或 HTML,但它们的用途或功能可能有很大不同。如在 JavaScript 中,正则表达式模式用于 search()、match() 或 replace() 字符串方法,而 XML 文档中的表达式用于分隔元素内容。不过就语法而言,在编程语言或标记语言中使用几乎没有任何区别。

正则表达式可以由三个部分组成,无论使用哪种语言:

Patterns(表达式) 由元字符、普通字符和特殊字符组成,用于描述要匹配的文本模式。该模式可以仅由简单字符组成,也可以由简单字符和特殊字符的组合组成。
Delimiters(分隔符) 用于将正则表达式与其他文本区分开来。常用的分隔符是斜杠(/),但也可以使用其他字符作为分隔符。
Modifiers(修饰符) 用于指定正则表达式的行为。常见的修饰符包括 i(忽略大小写)、m(多行模式)、s(将点号匹配任何字符,包括换行符)和 x(忽略空白字符)。

以下是用于表达式中的一些典型语法符号及注释:

正则表达式语法的特殊字符 功能
[] 用于指定一个字符集,即可以匹配方括号内的任意一个字符。字符集可以包含单个字符、多个字符、字符范围等。
() 一个捕获组,用于将一组字符或模式捕获并保存起来,以便后续使用或匹配。捕获组可以用于提取子字符串、进行替换操作等。
- 一个连字符,用于表示范围或指定范围。它可以用于字符集或重复次数的修饰符中。
^ 在字符集中,^ 用于否定字符集;在断言中,^ 用于表示行的开头。
$ 用于匹配字符串的结尾。
. 匹配任意字符的元字符。可以匹配除了换行符( 、 )之外的任何字符。
* 是一个限定符,用于指定前一个字符或子表达式出现的次数。它可以表示零次或多次。
+ 是一个限定符,用于指定前一个字符或子表达式出现的次数。它可以表示一次或多次。
是一个限定符,用于指定前一个字符或子表达式出现的次数。它可以表示零次或一次。
{n} 是一个限定符,用于指定前一个字符或子表达式出现的次数。它表示前面的字符或子表达式必须精确出现 n 次。
{n,m} 是一个限定符,用于指定前一个字符或子表达式出现的次数范围。其中,n 表示最小次数,m 表示最大次数。
{n,} 是一个限定符,用于指定前一个字符或子表达式出现的次数范围,表示至少出现 n 次。
是一个边界断言符,用于指定一个单词的边界。它匹配一个单词的开头或结尾,即前后都是非单词字符(如空格、标点符号等)的位置。
B 是一个边界断言符,与 相反。它匹配一个单词内部的位置,即前后都是单词字符的位置。
d 是一个字符类,用于匹配任意十进制数字。等价于 [0-9]。
D 是一个否定断言符,用于匹配非数字字符。它是一个反向匹配符,用于与数字字符进行区分。
w 是一个元字符,用于匹配一个单词字符。单词字符包括字母、数字和下划线 [a-zA-Z_0-9]。
W 是一个反向字符断言符,用于匹配非字母数字字符。

当然,上面只是介绍了正则表达式的一些基础知识。正则表达式具有很高的灵活性和可塑性,从简单的文本编辑器到复杂的开发工具,都可以使用正则表达式进行文本处理。之前也提到了,又拍云 CDN 的边缘规则功能就运用到了正则表达式提取字符串,下面通过一些例子来了解一下它的强大之处。

正则表达式在又拍云CDN的应用

示例一:目录及参数改写

将请求 URL 转换为带参数的动态 URL,例如请求的 URL 为:


http://example.com/pay/25/8/...
需要 CDN 边缘节点转换为如下请求:
http://example.com/pay.php?payid=25&categoryid=8...

这个时候,pattern 部分需要提取目录数字,需要生成 $1 和 $2 这样的变量,如下规则所示:

"rule": "/pay.php?productid=$1&categoryid=$2",
"pattern": "^pay/([0-9]+)/([0-9]+)/(.*?).html$"

规则释义:当解析的 url 符合规则 ^pay/([0-9]+)/([0-9]+)/(.*?).html$,那么将请求导向到 /pay.php?productid=$1&categoryid=$2。

也即将 http://example.com/pay/25/8/...转换为http://example.com/pay.php?payid=25&categoryid=8...


示例二:文件名改写

pattern: /(.*)/playlist.m3u8$
rule: /$1'.m3u8'

规则释义:当访问地址为http://domain/app/stream/playlist.m3u8时,将访问地址改写为 http://domain/app/stream.m3u8。

应用场景:在直播应用场景中,因为客户端机制无法或者不方便升级的情况,可以通过 URL 改写,将 /stream/playlist.m3u8 改为 /stream.m3u8,其中 app 代表发布点,stream 代表流名。

示例三:URL 限速

假如请求的 URL 为:http://test.example.com/mp4/4E10F356C0FEAD359C33DC5901307461-10.mp4 ,需要对该类型文件进行限速,限速要求为:前 20MB 不限速,20MB 之后限速 800 KB/s,规则可这样编写:

"rule": "$WHEN($1, $EQ($_HOST, 'test.example.com'))$LIMIT_RATE_AFTER(20, m)$LIMIT_RATE(800, k)",
"pattern": "^(/).+-10.mp4$"

规则释义:当 $1 为真,且满足请求 HOST 为 test.example.com 时 ,开始 20MB 不限速,后面限制到 800KB/s。

又拍云 CDN 边缘规则功能结合正则表达式,搭配处理操作,可以帮助您简化内容分发业务逻辑,并提升终端用户访问体验。该规则可以快速部署且配置简单,可极大降低业务实现成本。网站及 Web 应用开发者或者安全工程师可以快速创建边缘规则集来提升网站安全及分发性能。

最后,我来推荐一个好用的正则表达式匹配测试工具:https://regex101.com/,可以快速测试哪些字符串能匹配规则,搭配规则详解,对于编写和测试超级方便。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 操作系统
    +关注

    关注

    37

    文章

    6808

    浏览量

    123289
  • 字符串
    +关注

    关注

    1

    文章

    578

    浏览量

    20508
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27530
  • 编辑器
    +关注

    关注

    1

    文章

    805

    浏览量

    31163
  • 正则表达式
    +关注

    关注

    0

    文章

    27

    浏览量

    3483

原文标题:揭秘神秘的字符串匹配工具——正则表达式

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    shell正则表达式学习

    正则表达式在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多
    发表于 07-25 17:18

    初识 Python 正则表达式

    Python 自带函数就能解决的问题,我们就没必要使用正则表达式了,这样做多此一举。而且上面例子中的正则表达式设置成为了一个常量,并不是一个正则表达式规则
    发表于 03-17 16:44

    深入浅出boost正则表达式

    什么是正则表达式正则表达式是一种用来描述一定数量文本的模式。Regex代表Regular Express. 如果您不知道什么是正则表达式,请看这篇文章:深入浅出之正则表达式
    发表于 09-08 18:09 9次下载

    PHP正则表达式

    PHP正则表达式,PHP建设必备的的工具,初学者简单易懂快速入门,高手进阶手册。
    发表于 04-18 10:46 0次下载

    精通正则表达式

    详细的快速正则表达式的查询电子书,简单而丰富
    发表于 05-16 18:04 5次下载

    关于java正则表达式的用法详解

    正则表达式 一个正则表达式是一个用于文本搜索的文本模式。换句话说,在文本中搜索出现的模式。例如,你可以用正则表达式搜索网页中的邮箱地址或超链接。 正则表达式示例 下面是一个简单的Jav
    发表于 09-27 14:24 0次下载

    快速入门IPv6和正则表达式

    对于日常开发中只接触IPv4,并没有深入研究过正则表达式的开发者,面对IPv6和正则表达式,容易产生畏惧心理,觉得是两座难以翻越的大山。本文通过一些表格整理对IPv6的表示方法,以及正则表达式的特殊符号进行了分类和说明,带领大家
    的头像 发表于 03-30 09:31 8998次阅读
    快速入门IPv6和<b class='flag-5'>正则表达式</b>

    Python正则表达式的学习指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化
    发表于 09-15 08:00 0次下载
    Python<b class='flag-5'>正则表达式</b>的学习指南

    Python正则表达式指南

    本文介绍了Python对于正则表达式的支持,包括正则表达式基础以及Python正则表达式标准库的完整介绍及使用示例。本文的内容不包括如何编写高效的正则表达式、如何优化
    发表于 03-26 09:13 10次下载
    Python<b class='flag-5'>正则表达式</b>指南

    C语言如何使用正则表达式

    C语言的正则表达式规则,特此跟大家分享。
    的头像 发表于 03-16 08:41 4933次阅读

    python正则表达式中的常用函数

    编译正则表达式模式,返回一个正则对象的模式。(可以把那些常用的正则表达式编译成正则表达式对象,这样可以提高一点效率。)
    的头像 发表于 03-18 16:12 1793次阅读

    Linux入门之正则表达式

    一些约定好的匹配规则,但由于规则较多,可能比较容易忘记。 本文会先整理出所有的正则表达式以及其含义,接下来会利用grep命令,详细介绍每种正则表达式的使用方式,并给出案例。
    的头像 发表于 05-12 15:31 875次阅读
    Linux入门之<b class='flag-5'>正则表达式</b>

    shell脚本基础:正则表达式grep

    在Linux上有许多命令可以使用正则表达式,其中最常见的是grep命令和sed命令。正则表达式有多种类型,每种类型中可以使用的元字符类型不同。最常见的是基本正则表达式和扩展正则表达式
    的头像 发表于 05-29 09:29 1251次阅读
    shell脚本基础:<b class='flag-5'>正则表达式</b>grep

    Python中的正则表达式

    字符串的特征,这样我们就可以快速、高效地处理大量的文本数据。 基础语法 在Python中,使用re模块来操作正则表达式。re模块提供了很多函数,用于对字符串进行正则匹配和替换。以下是一些常用的
    的头像 发表于 06-21 16:52 983次阅读

    linux正则表达式匹配字符串

    在Linux操作系统中,正则表达式是一种强大的模式匹配工具,它可以用于在文本中查找、替换和筛选特定的字符串。准确掌握正则表达式语法和常见应用,对于Linux系统的管理员和开发人员来说
    的头像 发表于 11-23 10:26 722次阅读