正则表达式 101
本文将讨论正则表达式,或者简称“ Regex ”,其中“Reg”代表正则,“ex”代表表达式。在本文中,我将只使用“Regex”一词来指代正则表达式。
那么我们先来谈谈什么是正则表达式?
正则表达式用于匹配字符串中的特定模式。或者更简单地说,借助正则表达式,我们可以在文本中搜索特定的字符组合。
让我们借助一个图示示例来理解它——
在上图中,假设第一行是一个字符串。测试用例是正则表达式,因此我们利用正则表达式在字符串中搜索特定字符,如果匹配,则返回 true(如第二行所示),否则返回 false(如最后一行所示)。
现在让我们借助一个实际例子来理解它——
正则表达式 - /name/
文本 - 我的姓名是 Alok。
输出:真
接下来我们将讨论正则表达式的结构,但首先,让我们看看这里发生了什么。正则表达式“ name ”在文本“ My name is Alok. ”中搜索,由于匹配成功,因此返回 true,正如我们在图示示例中看到的那样。
除此之外,我们还可以用正则表达式做很多事情,我们将在本文后面看到,所以请坚持看到最后。
正则表达式结构
我们来谈谈正则表达式的结构(字面语法)——
/图案/
在两个正斜杠( / )之间写着一个模式,该模式将与文本进行匹配。
模式可以是单个字符、单词或使用特殊字符的标记,我们接下来会看到这些特殊字符。
示例-
单个字符
正则表达式 - /n/
文本 - 我的n名字是 Alok。
输出:真
一个词
正则表达式 - /Alok/
文本 - 我的名字是阿洛克输出
为真
定位锚点
借助锚点,我们可以匹配文本的开头或结尾。一些常见的锚点包括插入符号 ( ^ ) 和美元符号 ( $ )。
^ 搜索字符串的开头
正则表达式 - /^My/
文本 -我的名字是 Alok。
输出结果为真(以“My”开头)。
$ 搜索字符串末尾
正则表达式:/Alok$/
文本:我的名字是 Alok。
输出:false(不匹配,因为末尾有一个点 (.))
在讨论完标志和转义之后,我们再来看一些正则表达式。
旗帜
标志位用于为搜索添加额外功能。
它可以写成 ` /pattern/flags`,
例如 `/my/g`。
旗帜可以单独使用,也可以以任意顺序组合使用。
正则表达式中使用了许多标志,但最常用的是 -
| 关键词 | 旗帜 | 描述 |
|---|---|---|
| 克 | 全球的 | 匹配整个字符串,并且在第一次匹配后不再返回。 |
例子 -
正则表达式 - /n/
文本 - 我的n名字是 Aman。
输出结果为真(仅匹配第一次出现)。
正则表达式 - /n/g
文本 - 我的n名字是Aman
输出结果为真(现在它匹配字符串中的所有 n)。
| 关键词 | 旗帜 | 描述 |
|---|---|---|
| 我 | 冷漠无情 | 匹配时忽略大小写 |
例子 -
正则表达式 - /Alok/g
文本 - alok阿洛克
输出 - true(默认情况下区分大小写)
正则表达式 - /Alok/gi(这里我们同时使用了 g 和 i 标志)
文本 -阿洛克 阿洛克
输出为真(现在不区分大小写)
| 关键词 | 旗帜 | 描述 |
|---|---|---|
| 米 | 多行 | ^ 和 $ 分别匹配每行的开头和结尾 |
例子 -
正则表达式 - /^My/g
文本 -
我的名字是 Alok。
我的名字是 Aman。
输出:true(仅匹配第一行)
正则表达式 - /^My/gm
文本 -
我的我的名字是阿洛克。
我的名字是 Aman。
输出:true(现在所有行都匹配)
逃脱
转义字符用于将特殊字符视为文本。
例如,像^或$ 这样的特殊字符在正则表达式中具有特殊含义,即匹配字符串的开头或结尾,但如果我们想将插入符号 ( ^ ) 匹配为文本而不是特殊字符,该怎么办?
因此,我们使用反斜杠(\)来表示这个符号。让我们通过一个例子来理解它——
我们需要在任何特殊符号前使用反斜杠(\)将其视为文本。
例如(如果我们想匹配^Alok) -
正则表达式 - /^Alok/g
文本 - alok ^Alok
输出 - false(因为它不将 ^ 视为文本)
正则表达式 - /\^Alok/g
文本 - alok^阿洛克
输出为真(现在它将 ^ 视为文本)
一些常用且重要的正则表达式 -
角色职业 -
可以使用方括号[ ]表示法定义字符类。它匹配方括号 [ ] 内的字符。例如,/[ab]/匹配 a 或 b,如果与 g 标志一起使用,则匹配文本中的所有 a 和 b。
示例 -
正则表达式 - /[abc]/(使用 /[]/ 匹配方括号 [ ] 内的任何字符)
文本 -一个pricot boy ccd
输出 - true(匹配 a、b 或 c 字符)
正则表达式 - /[abc]/g(使用 /[]/g 匹配方括号 [ ] 内的所有字符)
文本 -一个pricotboyccd
输出 - true(匹配字符 a、b 和 c)
使用插入符号 ( ^ ) 可以匹配除方括号 [ ] 内的字符之外的任何字符。同样地,当与 g 标志一起使用时,它可以匹配除方括号 [ ] 内的字符之外的所有字符。
示例 -
正则表达式 - /[^abc]/
文本 - apple boy cat
输出 - true(匹配除 a、b 和 c 字符之外的任何字符)
正则表达式 - /[^abc]/g(使用 /[^]/g 匹配除方括号 [ ] 内的字符之外的所有字符)
文本 - a苹果boycat
输出 - true(匹配所有字符,包括空格,但不包括 a、b 和 c 字符)
使用连字符(-)符号,我们可以定义要匹配的字符范围。
例子 -
正则表达式 - /[az]/g(使用 /[az]/g 匹配 az 范围内的所有字符)
文本 - A洛克
输出为真
类似地,使用插入符号 (^),我们可以匹配字符类中定义的范围内的任何字符。
例子 -
正则表达式 - /[^az]/g(使用 /[^az]/g 匹配除 az 范围内的所有字符)
文本 -一个lok
输出-真
我们还可以将不同的范围组合到一个角色类中。
例子 -
正则表达式 - /[a-zA-Z]/g(/[a-zA-Z]/g 匹配 az 和 AZ 范围内的所有字符)
文本 -阿洛克
输出为真
改变 -
可以使用“或”(|)符号定义匹配关系,其工作方式与“或”函数类似。例如,“ a|b ”表示匹配 a 或 b。如果未使用“g”标志,则匹配 a 或 b 中的第一个匹配项,忽略其他匹配项。
示例 -
正则表达式 - /a|b/(/a|b/ 匹配 a 或 b 的第一次出现)
文本 -boy apple
输出 - true(即使匹配也会忽略 a)
正则表达式 - /a|b/g(/a|b/g 同时匹配 a 和 b)
文本 -一个苹果boy一个pe
输出-真
预定义字符类 -
许多常用角色都带有预定义的快捷键。我们来看其中一些——
。
正则表达式 - /bn/g(.匹配任何单个字符)
文本 -禁止 垃圾桶
输出为真
\s
正则表达式 - /\s/g(\s 匹配任何空白字符)
文本 - 苹果 男生 猫
输出-真
同样,\S 匹配所有非空白字符。
\d
正则表达式 - /\d/g(\d 匹配任何数字,等效于 [0-9])
文本 - Ak47
输出为真
类似地,\D 匹配所有非数字字符,相当于 [^0-9]。
\w
正则表达式 - /\w/g(匹配任何单词,等效于 [a-zA-Z0-9_])
文本 -阿克-47
输出为真
类似地,\W 匹配所有非单词字符,相当于 [^a-zA-Z0-9_]。
重复量词 -
使用重复量词,我们可以指定一个字符应该匹配多少次。让我们来看一些例子——
问号(?)
(?)匹配前一个标记,匹配次数为零到一。
例子 -
正则表达式 - /ba?/g(/ba?/g 匹配零个或一个a 与 b)
文本 - ab ba ba一个ba输出
为真
星号 ( * ) -
(*)与前一个标记匹配零次或多次。
例子 -
正则表达式 - /ba*/g(/ba*/g 匹配零个或多个a 与 b)
文本 - ab ba 咩咩 咩咩
输出为真
加号(+)-
(+)匹配前一个标记一次或多次。
例子 -
正则表达式 - /ba+/g(/ba+/g 匹配a 与 b 中的一个或多个
) 文本 - abba 咩咩 咩咩
输出为真
花括号({})-
{ } 有三种用法。让我们逐一来看——
{3} 与前一个标记完全匹配 3 次
例子 -
正则表达式 - /a{3}/g(/a{3}/g 匹配 3 个 a)
文本 - a aa啊啊 啊啊输出
为真
{3,} 与前一个标记匹配 3 次或更多次。
例子 -
正则表达式 - /a{3,}/g(/a{3,}/g 匹配 3 个或更多 a)
文本 - a aa啊啊 啊啊啊
输出为真
{2,4} 表示与前一个标记匹配 2 到 4 次。
例子 -
正则表达式 - /a{2,4}/g(/a{2,4}/g 匹配字母 a 的第 2 和第 4 个字符)
文本 - aaa 啊啊 啊啊啊 啊啊啊输出
为真
团体
可以使用分组来将多个字符视为一个整体。
要使用分组,我们使用括号()。
例如,当我们使用 /ba+/ 时,+ 会搜索一个或多个与 b 匹配的 a,正如我们在上面的例子中看到的那样,但如果我们使用 group,即 /(ba)+/,那么 + 将会搜索一个或多个 ba 在一起。
例子 -
正则表达式 - /t|The/g
文本 -这狗跳过t栅栏。
输出-真
正则表达式 - /(t|T)he/g
文本 -这狗跳过这围栏。
输出-真
如上所示,他现在同时作用于t和T。
我想谈谈群体发展中的两个重要概念——积极展望和消极展望。我们逐一讨论。
积极展望(?=...) -
利用正向先行断言,我们可以搜索后面跟着特定字符串的文本。
例子 -
正则表达式 - /foo(?=t)/g
文本 - 食物福t
输出-真
在这个例子中,只有后面跟着t 的foo会被匹配。
负面前瞻(?!……) -
利用否定式前瞻,我们可以搜索后面没有特定字符串的文本。
例子 -
正则表达式 - /foo(?!t)/g
文本 -福d 脚
输出-真
其中,只有后面不跟t 的foo才会被匹配。
注意 - 括号内的单词(即t )未匹配。
如何在JS中使用
我们已经了解了如何使用正则表达式,现在让我们看看如何在 JavaScript 中实现它。
这和我们目前所看到的非常相似。
例子 -
let regex = /Alok/
let text = "My name is Alok."
let isExisting = regex.test(text)
console.log(isExisting) //gives output true
你只需要将正则表达式和字符串存储在变量中,然后使用test()函数来匹配字符串中的正则表达式即可。
它会输出 true 或 false,正如我们目前在示例中看到的那样。
我们还可以使用RegExp()构造函数来定义正则表达式。
我们来看看具体是怎么做的——
let regex = new RegExp("Alok");
它的工作方式与之前相同。但正如你所看到的,字面语法更简单一些,而且工作方式相同,因此通常情况下,开发人员更喜欢只使用字面语法。
不同的使用场景
正则表达式有很多应用场景,但我们来看一些重要的例子——
匹配() -
match() 方法在字符串中搜索匹配项,并返回一个匹配项数组;如果没有找到匹配项,则返回 null。
例子 -
let regex = /[A-Z]/g
let text ="My name is Alok."
let found = text.match(regex)
console.log(found) // returns an Array = ["M","A"]
代替() -
replace() 方法接受两个参数。一个是要搜索的正则表达式,另一个是要将匹配项替换为的文本。
例子 -
let regex = /[A-Z]/g
let text ="My name is Alok."
let found = text.replace(regex,"S")
console.log(found) // returns - Sy name is Slok.
注意——我们之前看到的test()方法是一个正则表达式方法,它接受一个字符串作为参数,而match()和replace()方法是一个字符串方法,它接受一个正则表达式作为参数。
应用程序
这里我将列举一些正则表达式的应用领域,或者说正则表达式的使用领域,如果你感兴趣,可以深入研究一下——
- 验证用户输入
- 文件搜索
- 数据抓取
- 编译器中的词法分析
- 文本编辑器中的查找和替换功能
- 解析
- 搜索引擎
接下来是什么?
正则表达式的应用和类型非常庞大,一篇短文根本无法涵盖。
即使是经验丰富的开发者,也常常会觉得正则表达式难以掌握。所以,如果你觉得这些内容有点复杂,也不用担心。
大多数常用的正则表达式都可以在你需要的时候轻松地从互联网上找到。
接下来,我建议你访问regex101.com 网站,练习一下我们目前为止学到的所有内容。
这是一个很棒的平台,可以用来练习和学习正则表达式。此外,它还自带一个正则表达式库,人们会在上面发布一些常用的重要正则表达式。
感谢阅读🙂
如果你觉得有用,可以分享给其他人哦 :)
欢迎随时打个招呼,我们聊聊吧👋👋👋
文章来源:https://dev.to/thecoollearner/regex-101-3cba
