如何使用常规表达式 (regex):开发人员的完整指南

阅读时间 12 分钟

开始从零开始学习常规表达式. 基本语法,字符类,量化器,组,Lookahead,lookbehind以及电子邮件,电话,URL和IP的常见模式.

它们是常规的表达,

它们 常规表达式 搜索模式可以非常精确地找到,验证和操作文本.

定期表达是基本上一个 定义搜索模式的字符串只有一个行 Regex 可以做其他需要几十条条条条条的条件代码.

常见常态表达式的使用:

  • 验证数据: 检查电子邮件,电话,URL或邮政码是否正确格式
  • 搜索和替换: 找到长文本中的模式并替换它们 (如文本编辑器或IDE)
  • 数据提取: 摘出特定信息从未结构化的文本中 (web scraping, logs)
  • 记录的解析: 分析服务器和应用程序登记文件
  • 接和格式化: 检查代码是否符合某些规范
  • 在网络框架中进行路由: 在 Express, Django, Rails 等等上定义URL模式

几乎可以使用 regex. 所有的编程语言字符串的使用方式:JavaScript,Python,Java,C#,PHP,Ruby,Go,Rust等.

如果你想练习,当你读这本指南时,请打开我们的. 试验工具 在另一个小小时里.

基本语法:字体和元字符

雷杰克斯语法分为两个类型的字符: 字体 它们是为了获得 标志性 (它们具有特殊意义).

字面字符:

字母,数字和许多符号都在字面上搜索. 在文本中找到"猫"这个词.

基本的特征:

标志性意思举个例子结果与
现在,我们要去.任何字符 (除了线跳)其他猫,子,子
现在,我们要去链路开始您好"世界好" (仅仅是开始)
美国链末端世界"世界好" (仅仅在最后)
现在,我们要去零或以上的重复其他类型的子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子
其他国家一次或多次重复+"abc", "abbc" (非"ac")
现在,我们要去做什么?其他可选的重复其他类型的子
现在,我知道其他方式猫狗"猫"或"狗"
逃跑 (字母为下一个字符)现在,一个字面上的点

逃离 metacharacters:

如果你需要寻找一个字母字符,你应该用字母字符来逃跑. 例如:

  • 现在, 寻找字面点 (不是"任何字符")
  • 寻找一个字面上的星座
  • 没有什么. 寻找字面问题标志
  • ,我知道 其他 ) 他们寻找字面关系
  • 寻找一个字面反向的条

实践例子: 为了查找"价格:9.99美元"的链接,你需要: 价格: $9\.99

字符类和预定义类

它们 字符类 它们可以让你定义一个符号集合,

带的定制课程 [ ]:

总裁意思巧合的例子
其他地方任何a,b或c其他类型的子
其他地方任何小字母子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子
现在,我们要做什么?任何大字母,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
其他地方任何数字其他其他类型
现在,我们要做什么?任何字母子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子,子
其他地方:任何字母数字其他类型的子
们的们任何除a,b,c外其他类型的子
其他地方任何非字体"a", "!", "

预定义类 (简称):

预定义类是常见组合的缩写:

短途同等意思
其他地方任何数字
其他地方任何非字体
现在,我们要做什么?任何字符 (字母字母 +字幕)
现在,我们要做什么?任何非字符的字符
其他地方现在,我们要做什么?任何空白
现在,我们要做什么?任何非空白的东西
(没有直接的同等)字段限制

字数限制 (\b):

尤其有用搜索完整的单词. 它是位置,不用字符.

实践例子: 为了验证链只包含字母,数字和字体: 子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子子

复制量化器和修改器

它们 计量器 它们规定前列元素的出现次数.

基本量计:

计量器意思举个例子结果与
现在,我们要去零或以上次其他类型的子
其他国家一次或多次+其他类型的子
现在,我们要去做什么?零或一次- ,我知道.其他其他类型
确切是们的们其他"2026"和"1234" (精确4位数)
没有任何其他方法.没有或多次,,,,,,,,,,,,,,,,其他"12","123","1234" (2+个数字)
现在,我们要做什么?在 n 到 m 间,,,,,,,,,,,,,,,,"12", "123", "1234" (2至4个数字)

贪和惰的定量仪:

默认的定量仪是 贪的 (编码):他们试图与尽可能多的文本相匹配. 现在,我们要去做什么? 它们在量化器之后,会变成 (惰):它们可以与尽可能少的量相匹配.

区别的一个例子:

文字: 您的位置: 首页

  • 其他国家 (贪):与 您的位置: 首页 现在,我们要做什么?
  • 其他国家 (惰):与 您的位置: 其他 世界 其他地方

差异在 HTML,XML或任何文本使用重复界限时都很重要.

实践例子: 验证选用字体和4个额外数字的5位邮政码 (美国格式): ,我知道你是个.

这与"12345"和"12345-6789"相符,但不是"1234"和"123456".

捕捞集团和参考集团

它们 集团 它们可以将图案的部分组合在一起,捕捉相匹配的文本,然后使用后面,

组类型:

语法个好的人描述
现在,我们要去做什么?捕捞集团集结和捕获相匹配的文本
现在,我们要做什么?没有被捕的小组集结但没有捕获 (更有效)
公司的公司名称名称的组具有可识别的名称的捕捉
,,,倒向引用引用集团1,2等所捕获的文本.

基本捕捞组:

为了从YYY-MM-DD格式日期中抽取年,月和日期:

们都在着.

  • 组1:年 (例如"2026")
  • 组2:月 (例如"03")
  • 组3:日 (例如"16")

在JavaScript中: 现在,我们在球上了. 返回一个数组, 其他国家 这就是2026年. 其他国家 这就是"03"和 其他国家 这就是"16".

名称组 (named groups):

现在,我们要做什么?

在JavaScript中: 赛事组赛现在, 现在,我们在球上.现在, 现在,我们在球上.

后转引用:

让他们引用前一个群体所捕获的精确文本:

  • 其他地方: 找到重复的字符 ("the", "the", "the")
  • 其他地方: 在句子之间找到文字,确保开关和关闭的句子一致

组间的选择:

现在,我们要做什么? 符合"http://","https://"或"ftp://"的字符

试试这些模式,用我们的实时模式. 子工具现在,我们要去.

位置指数:Lookahead和lookbehind

它们 其他 后面的看法 它们是证实一个老板是否存在于当前位置之前或之后的说法, 没有消耗字符它们对复杂的验证非常强大.

据说,这四种类型:

语法名称意思
公司主管积极的头接下来必须与老板一致
现在,我们要做什么?负面的头脑下面的内容不应该与老板一致
公司主管积极的看待之前的内容必须与老板一致
公司主管负面的看待上面的内容不应与老板一致

实例1:验证强密码

要求至少一个大字母,一个小字母,一个数字和8+字符的密码:

,我知道你是个,

  • 现在,我们要做什么?: 阳性Lookahead - 必须含有至少一个字母头
  • 现在,我们要做什么?必须至少包含一个小字母
  • ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,.必须包含至少一个数字
  • 现在,我们要做什么?必须有8个或以上的字符

举例2: 找不到货币符号的价格

现在,我们要做什么?

在"价格为29.99美元,发货为5.00美元"文本中,

举例3:找到一个不被某个老板所追随的单词

,我还没有说过.

找出两个点后续不到的单词.

例子4:未经脚本前列的数字

们的们,

在 "5 -3 8 -12"中,你会找到 "5"和"8"但不是 "3"或"12".

适用性说明: 查看后面并不是所有 Regex 味道都支持. JavaScript 自 ES2018以来都支持它们. Python, Java, C# 和 .NET 完全支持它们.

常见模式:电子邮件,电话,URL和IP

这些是最常见的验证模式的常规表达式. 请记住,没有一个 regex 是100%完美的复杂格式,如电子邮件;

1.电子邮件 (实践验证):

现在,我们在这个世界里,

  • 地方部分:字母,数字,点,脚本,字幕, %, +
  • 必须使用分隔器
  • 域名:字母,数字,点,脚本
  • 域名:至少2个字母
  • 有效:用户@example.com,姓氏@公司.co.uk

2.国际电话 (E.164格式):

,我还没有说过.

  • 开始时可选
  • 第一个数字:1-9 (不能从0开始)
  • 总共可达15个数字
  • 有效号: +573001234567,12025551234

3. URL (HTTP/HTTPS):

现在,我们在车上,我们在车上了.

  • 协议:http://或http://
  • 域名:字母和字符串
  • 域名:至少2个字母
  • 路径:任何有效的URL字符 (可选)

4.IPv4地址:

现在,我们需要一个新的方法来解决问题.

  • 单点分隔的4 octet
  • 每个八:0-255
  • 有效: 192.168.1.1, 10.0.0.1, 255.255.255.0
  • 拒绝: 256.1.1.1,192.168.1.999

5. 标准标准格式日期 (YYYY-MM-DD):

,我认为这是一个非常好的选择.

  • 年代:四位数
  • 时间:
  • 时间:01-31
  • 没有有效的假日 (如02-30),所以你需要额外的逻辑

6. CSS 颜色的六分之一:

,我不想让你知道.

  • 格式:#RGB,#RRGGBB,#RRGGBBAA
  • 有效: #fff, #FF5733, #FF573380

检测和调整所有这些模式在我们的 试验工具为了验证包含这些模式的JSON数据, 验证器现在,我们要去.

旗,绩效和好做法

要掌握Regex,你需要了解 标签: 标签: 并且遵循良好的做法,以避免性能和维护性问题.

常见的旗:

名称影响
全球找出所有相匹配,不仅仅是第一场
其他无情的子没有区分大字母和小字母
其他跨线和$与每一个线的开始/结束相符,不仅是链的开始/结束
其他标记 (.) 也与线跳相符
您的位置统一码完全支持 Unicode 字符

在JavaScript中: 标志 - 举例: 您好,世界

在Python中: 现在,我们需要一个新的方法.

绩效良好实践:

  • 避免灾难性的后续追踪: 公司主管 其他其他类型 它们可以使Regex引擎测试数量多的组合.其他类型) 或可用的原子组
  • 具体说明: 其他地方 现在,你应该做什么? 其他国家 你的老板越具体,你就越快.
  • 着: 现在,我们要去 其他 美国 告诉引擎从哪里开始到哪里结束,避免不必要的搜索
  • 他更喜欢没有捕获的群体: 现在,我们要做什么? 它比 其他国家 当你不需要捕捉时
  • 如果使用一次性,将regex编译成: 在Python中使用 编译 ()在Java中使用 专业的设计

保持良好实践:

  • 他对你的回应说: 在Python中,你可以使用旗 为了添加评论和可读空间
  • 它们分为复杂的模式: 它们是单一的,而不是单一的,
  • 他写下测试: 他总是写出积极和负面的相对的证据.
  • 不要为所有事物使用regex: 为了浏览HTML或XML,使用专用解析器. 其他信息雷格斯不适合繁殖语言

练习和完善你的模式,用我们的 试验工具让你看到实时相匹配,并解释了老板的每一个部分.

试试这个工具:

打开工具

常见问题

在regex中+和+之间有什么区别?

星空 (*) 表示前列元素的 0 次或以上重复: 'ab*c'与 'ac', 'abc', 'abbc'相符. 'mas (+) 符号表示 1 次或以上重复: 'ab+c'与 'abc', 'abbc'相符,但不是'ac'相符. 问号 (?) 表示 0 次或 1 次 (可选): 'colou?r'与 'colour'和'colour'相符.

有什么意思是一个定期表达的电子邮件?

一个实用模式是: ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$. 这有效的基础结构:允许字符的本地部分,衣装,域名和至少2个字母的TLD.

在regex中,什么意思?

它们是预定义字符类 (简称). \d等于 [0-9] (任何数字). \w等于 [a-zA-Z0-9_] (任何字符加上字幕). \s等于任何空白空间 (空间,表格,直线跳).

他是个疯子,他有什么用?

假设一个Lookahead是一个证据,它检查了是否存在一个老板在当前位置之后,没有消耗字符.正面的Lookahead (?=patron) 检查了老板 SI存在.负面的Lookahead (?!patron) 检查了没有存在.它们对于复杂的验证来说有用:

什么是灾难性后,如何避免?

灾难性后追是当一个模糊的老板让regex引擎测试数量数量的组合时发生的. 举个例子: (a+) +$ 用'aaaaaaaaaaab'输入. 引擎试图在失败之前在两个量计之间划分'a'的所有方式.

雷杰斯在所有编程语言上都能运行得一样吗?

虽然基本语法是相似的,但每个语言都有其 Regex 的独特的"味道".JavaScript不支持变长度的 lookbehind.Python有re模块和最先进的 regex.Java需要双式排放 (\\d而不是 \d).PCRE (PHP,Perl) 支持回复和条件.最常见的差异在 lookahead/lookbehind,Unicode和像 recursion这样的先进功能中.