您唯一需要的 RegEx 指南

您唯一需要的 RegEx 指南

正则表达式是字符 模式 将文本中的字符序列关联起来。我们可以使用正则表达式来提取或替换部分文本,以及 HTML 页面中的地址或链接图像、修改文本格式或删除无效字符。

在本文中,我们将学习以下主题及更多内容:

  • 正则表达式的结构如何?
  • 正则表达式的元素是什么?
  • 如何在 Javascript 中使用正则表达式?
  • 奖金: 最有用的正则表达式备忘单

我们开工吧!

Photo by 布莱克康纳利 on 不飞溅

RegEx 的结构如何?

正则表达式基本上由 3 个组件组成:

  1. RegEx 本身,负责定义要匹配的模式
  2. 数据输入,构成将要经过正则表达式作用的数据
  3. 引擎,负责应用表达式

例如:假设我们需要一个 RegEx 验证电子邮件。 在这种情况下,我们将有以下组件:

  1. RegEx 将描述 有效电子邮件的模式
  2. 数据输入将是 电子邮件通知 由用户进行验证
  3. 引擎将是 编程语言 用于应用表达式

如何创建正则表达式?

正则表达式必须用斜线 (/) 括起来。并且在表达式之后,可能会有一些被调用的执行指示 旗帜 .

 /元字符/[标志]

标志用于为引擎提供执行正则表达式时使用的特殊参数。标志是可选的,将被执行正则表达式的引擎接受或拒绝。

最常见的标志是:

  • 我(忽略大小写) — 不应考虑大小写字符之间的差异。
  • g(全球来源) — 在数据输入时启用全局数据捕获,以及保存出现索引并允许在它们之间导航(即,如果您的输入多次匹配,使用此标志您将获得所有结果,否则只会返回第一个匹配项)
  • m(多行) — 通知条目由多行组成,从而将正则表达式应用于每一行。

什么是元字符?

元字符是在正则表达式中有意义的特殊字符。它们用于告诉引擎如何解析输入数据。正则表达式或 RegEx 由一组这些元字符组成。

每个元字符 服务于特定的功能 视情况而定。您可以创建许多组合并使用这些组合来执行更复杂的表达式。

让我们看看最常用的元字符:

开始 (^) 和结束 ($)

^(开始) — 表示正则表达式中的行首。句法: /^<....>/

$(结束) — 表示正则表达式中的行尾。句法: /<...>$/

示例 1:

  • 正则表达式: /^[1,9]/g
  • 输入: 0,1,2,3,4

这里 没有匹配 ,因为 RegEx 搜索的行 开始 字符介于 1 和 9 之间。

示例 2:

  • 正则表达式: /^[1,9]/g
  • 输入: 1,2,3,4,5
  • 火柴: 1

这里 有一场比赛 ,因为输入以数字 1 开头。

示例 3:

  • 正则表达式: /[1,9]$/g
  • 输入: 1,2,3,4,5
  • 火柴: 5

也是一场比赛 , 但使用行尾,所以它匹配数字 5。

字符组([ 和 ])

[(小组开始) — 表示字符组的开始。句法: /[<....>]/

](小组结束) — 表示字符组的结束。句法: /[<...>$]/

例子:

想象一下,我们想要获取名称为“John”的所有匹配项,无论它们是用大写字母还是小写字母书写的。然后我们需要告诉引擎第一个字符可以是“j”或“J”。

  • 正则表达式: /[J,j]ohn/g

  • 输入:

    约翰
    约翰
    约翰
    约瑟夫

  • 火柴: 约翰 , 约翰

点 (.)

. (通配符) — 表示任何其他字符。句法: /./

例子:

想象一下,我们想要获取所有有四个字母并以后缀“and”结尾的单词。

  • 正则表达式: /.和/g

  • 输入:


    相同的
    棍棒
    土地

  • 火柴: , 棍棒 , 土地

逻辑运算符 AND (.*)

(和)* — 在两个表达式之间进行逻辑运算 AND。句法: /<exp-1> .*<exp-2> /

例子:

想象一下,我们想要获取所有以元音开头和结尾的名字。

  • 正则表达式: /[AEIOU].*[aeiou]/g

  • 输入:

    阿米拉
    安娜
    劳拉
    苏菲
    奥利维亚

  • 火柴: 阿米拉 , 安娜 , 奥利维亚

逻辑运算符 OR (|)

| (或者) — 在两个表达式之间进行逻辑运算 OR。句法: _/ <exp-1> |<exp-2> /_

例子:

想象一下,我们想从数据输入中获取所有大型商店(超级商店或大型商店)。

  • 正则表达式: /^(super|mega)store/gm

  • 输入:

    超市
    小店
    大型商店

  • 火柴: 超市 , 大型商店

逻辑运算符 NOT (^)

^ (不是) — 在表达式之前进行逻辑运算 NOT。句法: _/[_ ^<exp> ] _/_

例子:

想象一下,我们想要获取所有不以元音开头的名称。

  • 正则表达式: /^[^AEIOU].*/gm

  • 输入:

    阿曼达
    山姆
    约翰
    安娜

  • 火柴: 山姆 , 约翰

花括号({ 和 })

{} (重复) — 允许您检测表达式在 n 次或范围内的重复。句法: _/ <exp> {最小,最大}/_

例子:

让我们编写一个表达式来获取所有包含 7 个字母并以结尾的单词 nd .

  • 正则表达式: /^.{7}nd*/gm

  • 输入:

    命令
    反弹
    芥末
    管理人员
    入站

  • 火柴: 命令 , 反弹 , 入站

加号 (+)

+(出现 1 次或多次) — 检查左边的字符是否在输入中至少出现一次。句法: _/ <exp> +/_

例子:

让我们编写一个表达式来获取所有出现的字符“c”。

  • 正则表达式: /a+/gm

  • 输入:

    音乐

    技术
    成功

  • 火柴: 穆斯 **C** , 这 **C** 技术学 , 他们是 **抄送** 埃斯

问号 (?)

? (0 或 1 次出现) — 检查左边的字符是否在输入中出现 0 或至少出现一次。使其成为可选。句法: _/ <exp> ?/_

例子:

想象一下,我们想要获得单数或复数形式的 car,但不要拼错。

  • 正则表达式: /^car[s]?$/gm

  • 输入:


    汽车
    卡兹

  • 火柴: , 汽车

星号 (*)

*(0 次或多次出现) — 检查左边的字符是否在输入中出现 0 次或多次。句法: _/ <exp> */_

例子:

想象一下,我们想要得到与这个人写的一样多的“y”这个词。

  • 正则表达式: /^嘿*$/gm

  • 输入:


    嘿嘿
    嘿嘿
    嘿嘿

  • 火柴: , 嘿嘿 , 嘿嘿

连字符 (-)

- (间隔) — 检查与字符间隔对应的匹配项。句法: _/[ <start> -<end> ]/_

例子:

想象一下,我们想要获取从字母 A 到 M 的所有名称。

  • 正则表达式: /^[上午].*$/gm

  • 输入:

    阿曼达
    内特

    克拉克

  • 火柴: 阿曼达 , , 克拉克

字母数字和非字母数字(\w 和 \W)

\w(字母数字) — 检查字母数字字符和下划线。句法: _/\w/_

\W(非字母数字) — 检查非字母数字字符(例如特殊字符)。句法: _/\W/_

例子:

  • 正则表达式: /\w/gm

  • 输入:

    测试
    1234
    测试_123
    测试$%测试
    $%&*&

  • 火柴: 测试 , 1234 , 测试_123 , **测试** $% **测试**

数字和非数字(\d 和 \D)

\d(数字) — 检查代表数字的字符。句法: _/\d/_

\D(非数字) — 检查非数字字符。句法: _/\D/_

例子:

  • 正则表达式: /\d/gm

  • 输入:

    123
    测试
    测试_123

  • 火柴: 123 , 测试_ **123**

空格和非空格(\s 和 \S)

\s(空格) — 检查对应于空格的字符(空格、制表符、换行符和回车符)。句法: _/\s/_

\S(非数字) — 检查非空格字符。句法: _/\S/_

捕获和非捕获组(“()”和“(?😃”)

()(捕获组) — 对要捕获的字符序列进行分组。使用此元字符时会产生子匹配。句法: _/( <characters> )/_

(?😃(非捕获组) — 对不应捕获的字符序列进行分组。句法: _/(?: <characters> )/_

如何在 Javascript 中使用正则表达式?

在 Javascript 中,正则表达式是 RegExp 类的对象。我们可以用两种方式定义它:

字面形式:

 常量 myExpression = /test/;

使用 RegExp 构造函数:

 const myExpression = new RegExp('test');

然后,我们可以开始使用我们的表达式,假设我们想在一个字符串中找到一个匹配项:

 常量 newRE = /d(b+)d/g;  
 常量匹配 = newRE.exec('cdbbdbsbz');

正则表达式方法

创建正则表达式后,我们可以使用一些方法,以下是其中的一些:

  • 执行() — **** 在字符串中搜索匹配并返回结果数组

    const myExp = RegExp('foo*', 'g');
    myExp.exec('桌上足球,桌上足球');

  • 测试() — 在字符串中搜索匹配并返回 真的 或者 错误的

    const str = '桌上足球';
    const regex = new RegExp('foo*'); 正则表达式.test(str); // 真的

  • 匹配() — 在字符串中搜索匹配项并返回结果数组

    const 段落 = '这只敏捷的棕色狐狸被命名为玛丽。';
    常量正则表达式 = /[AZ]/g;
    const found = paragraph.match(regex); 控制台.log(找到); // 数组 ["T", "M"]

  • 搜索() — 搜索正则表达式之间的匹配并返回匹配的索引

    const 段落 = '这只敏捷的棕色狐狸跳过了懒惰的狗。如果狗吠,它真的很懒吗? // 任何不是单词字符或空格的字符
    常量正则表达式 = /[^\w\s]/g; console.log(paragraph.search(regex)); // 43

  • 代替() — 返回一个新字符串,其中一个、部分或所有匹配的模式被替换

    const text = '敏捷的棕色狐狸跳过懒狗。如果狗有反应,它真的很懒吗? 常量正则表达式 = /Dog/i;
    console.log(text.replace(regex, 'ferret'));
    // “敏捷的棕狐跳过了懒惰的雪貂。如果狗有反应,那真的是懒惰吗?”

最常用的正则表达式备忘单

  • 电子邮件

    [a-zA-Z0-9.!#$%&'*+/=?_`{|}~-][email protected][a-zA-Z0-9](?:[a-zA- Z0-9-]{0,61}[a-zA-Z0-9])?(?:.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0 ,61}[a-zA-Z0-9])?)*$

  • 电子邮件(但仅限 Gmail 和 Hotmail)

    ^([\w-.][email protected](?!gmail.com)(?!hotmail.com)([\w- ]+.)+[\w-]{2,4})? $

  • 网址

    ^(?:http(s)?😕/)?[\w.-]+(?:.[\w.-]+)+[\w-._~:/? #[]@!$&'()*+,;=.]+$

  • 电话和手机号码

    ((?([\d -)\–+/(]+))?([ .-–/]?)([\d]+))

  • 修剪字符串

    [1](.?)[\s]*$

  • IP地址

    ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0 -4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01] ?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]? )$

  • 用户名(1-15 个字母数字字符)

    ^(?=.[a-zA-Z]{1,})(?=.[\d]{0,})[a-zA-Z0-9]{1,15}$

结论

这就是今天的内容。这是一篇很长的文章,但我真的希望这篇文章对您使用 RegEx 有所帮助,并且您将来可以在编写新表达式时将其用作指南。

谢谢阅读!在本平台关注我,阅读更多开发内容。祝你有美好的一天,很快再见!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/20718/39060700


  1. \s ↩︎

posted @ 2022-09-07 00:39  哈哈哈来了啊啊啊  阅读(82)  评论(0编辑  收藏  举报