1
0

fix(bug): 修复 Markdown 格式错误

This commit is contained in:
周中平 2022-01-23 01:04:54 +08:00
parent c1762313e7
commit 28c3c3a1ad
No known key found for this signature in database
GPG Key ID: B1DF9DD42D8E00DC
4 changed files with 38 additions and 154 deletions

View File

@ -3,7 +3,6 @@ id: 反向面试
title: 反向面试
data: 2022年1月22日
---
## 反向面试
> 大部分翻译自https://github.com/viraptor/reverse-interview ,亦有其他网友补充。
> 译者总结的一份适合突击记忆的简洁版 LeetCode 题解和面试问题,也欢迎 Star。https://github.com/yifeikong/interview

View File

@ -17,6 +17,8 @@ data: 2022年1月21日
## 总结
**反推即可知当下可为不可为**
祝愿看到这篇文章的每一位好友
早日暴富富富富富富富

View File

@ -5,8 +5,6 @@ sidebar_position: 1
data: 2022年1月22日
---
## 什么是正则表达式?
> 正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子.
一个正则表达式是在一个主体字符串中从左到右匹配字符串时的一种样式.
@ -21,46 +19,12 @@ data: 2022年1月22日
以上的正则表达式可以接受 `john_doe`, `jo-hn_doe`, `john12_as`.
但不匹配`Jo`, 因为它包含了大写的字母而且太短了.
目录
=================
* [1. 基本匹配](#1-基本匹配)
* [2. 元字符](#2-元字符)
* [2.1 点运算符 .](#21-点运算符-)
* [2.2 字符集](#22-字符集)
* [2.2.1 否定字符集](#221-否定字符集)
* [2.3 重复次数](#23-重复次数)
* [2.3.1 * 号](#231--号)
* [2.3.2 号](#232--号)
* [2.3.3 ? 号](#233--号)
* [2.4 {} 号](#24--号)
* [2.5 (...) 特征标群](#25--特征标群)
* [2.6 | 或运算符](#26--或运算符)
* [2.7 转码特殊字符](#27-转码特殊字符)
* [2.8 锚点](#28-锚点)
* [2.8.1 ^ 号](#281--号)
* [2.8.2 $ 号](#282--号)
* [3. 简写字符集](#3-简写字符集)
* [4. 前后关联约束(前后预查)](#4-前后关联约束前后预查)
* [4.1 ?=... 前置约束(存在)](#41--前置约束存在)
* [4.2 ?!... 前置约束-排除](#42--前置约束-排除)
* [4.3 ?<= ... 后置约束-存在](#43---后置约束-存在)
* [4.4 ?<!... 后置约束-排除](#44--后置约束-排除)
* [5. 标志](#5-标志)
* [5.1 忽略大小写 (Case Insensitive)](#51-忽略大小写-case-insensitive)
* [5.2 全局搜索 (Global search)](#52-全局搜索-global-search)
* [5.3 多行修饰符 (Multiline)](#53-多行修饰符-multiline)
* [额外补充](#额外补充)
* [贡献](#贡献)
* [许可证](#许可证)
## 1. 基本匹配
正则表达式其实就是在执行搜索时的格式, 它由一些字母和数字组合而成.
例如: 一个正则表达式 `the`, 它表示一个规则: 由字母`t`开始,接着是`h`,再接着是`e`.
"the" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat.
"the" => The fat cat sat on **the** mat.
[在线练习](https://regex101.com/r/dmRygT/1)
@ -68,9 +32,7 @@ data: 2022年1月22日
正则表达式是大小写敏感的, 所以`The`不会匹配`the`.
<pre>
"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
</pre>
"The" => **The** fat cat sat on the mat.
[在线练习](https://regex101.com/r/1paXsy/1)
@ -90,7 +52,7 @@ data: 2022年1月22日
|{n,m}|匹配num个中括号之前的字符 (n <= num <= m).|
|(xyz)|字符集, 匹配与 xyz 完全相等的字符串.|
|&#124;|或运算符,匹配符号前或后的字符.|
|&#92;|转义字符,用于匹配一些保留的字符 <code>[ ] ( ) { } . * + ? ^ $ \ &#124;</code>|
|&#92;|转义字符,用于匹配一些保留的字符 `[ ] ( ) { } . * + ? ^ $ \ &#124;`|
|^|从开始行开始匹配.|
|$|从末端开始匹配.|
@ -100,9 +62,7 @@ data: 2022年1月22日
`.`匹配任意单个字符, 但不匹配换行符.
例如, 表达式`.ar`匹配一个任意字符后面跟着是`a`和`r`的字符串.
<pre>
".ar" => The <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
</pre>
".ar" => The **car** **par**ked in the **gar**age.
[在线练习](https://regex101.com/r/xc9GkU/1)
@ -114,18 +74,14 @@ data: 2022年1月22日
在方括号中的字符集不关心顺序.
例如, 表达式`[Tt]he` 匹配 `the``The`.
<pre>
"[Tt]he" => <a href="#learn-regex"><strong>The</strong></a> car parked in <a href="#learn-regex"><strong>the</strong></a> garage.
</pre>
"[Tt]he" => **The** car parked in **the** garage.
[在线练习](https://regex101.com/r/2ITLQ4/1)
方括号的句号就表示句号.
表达式 `ar[.]` 匹配 `ar.`字符串
<pre>
"ar[.]" => A garage is a good place to park a c<a href="#learn-regex"><strong>ar.</strong></a>
</pre>
"ar[.]" => A garage is a good place to park a c**ar.**
[在线练习](https://regex101.com/r/wL3xtE/1)
@ -134,9 +90,7 @@ data: 2022年1月22日
一般来说 `^` 表示一个字符串的开头, 但它用在一个方括号的开头的时候, 它表示这个字符集是否定的.
例如, 表达式`[^c]ar` 匹配一个后面跟着`ar`的除了`c`的任意字符.
<pre>
"[^c]ar" => The car <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
</pre>
"[^c]ar" => The car **par**ked in the **gar**age.
[在线练习](https://regex101.com/r/nNNlq3/1)
@ -150,18 +104,14 @@ data: 2022年1月22日
`*`号匹配 在`*`之前的字符出现`大于等于0`次.
例如, 表达式 `a*` 匹配以0或更多个a开头的字符, 因为有0个这个条件, 其实也就匹配了所有的字符. 表达式`[a-z]*` 匹配一个行中所有以小写字母开头的字符串.
<pre>
"[a-z]*" => T<a href="#learn-regex"><strong>he</strong></a> <a href="#learn-regex"><strong>car</strong></a> <a href="#learn-regex"><strong>parked</strong></a> <a href="#learn-regex"><strong>in</strong></a> <a href="#learn-regex"><strong>the</strong></a> <a href="#learn-regex"><strong>garage</strong></a> #21.
</pre>
"[a-z]*" => T**he** **car** **parked** **in** **the** **garage** #21.
[在线练习](https://regex101.com/r/7m8me5/1)
`*`字符和`.`字符搭配可以匹配所有的字符`.*`.
`*`和表示匹配空格的符号`\s`连起来用, 如表达式`\s*cat\s*`匹配0或更多个空格开头和0或更多个空格结尾的cat字符串.
<pre>
"\s*cat\s*" => The fat<a href="#learn-regex"><strong> cat </strong></a>sat on the <a href="#learn-regex">con<strong>cat</strong>enation</a>.
</pre>
"\s*cat\s*" => The fat** cat **sat on the con**cat**enation.
[在线练习](https://regex101.com/r/gGrwuz/1)
@ -170,9 +120,7 @@ data: 2022年1月22日
`+`号匹配`+`号之前的字符出现 >=1 次个字符.
例如表达式`c.+t` 匹配以首字母`c`开头以`t`结尾,中间跟着任意个字符的字符串.
<pre>
"c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>.
</pre>
"c.+t" => The fat **cat sat on the mat**.
[在线练习](https://regex101.com/r/Dzf9Aa/1)
@ -181,15 +129,11 @@ data: 2022年1月22日
在正则表达式中元字符 `?` 标记在符号前面的字符为可选, 即出现 0 或 1 次.
例如, 表达式 `[T]?he` 匹配字符串 `he``The`.
<pre>
"[T]he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage.
</pre>
"[T]he" => **The** car is parked in the garage.
[在线练习](https://regex101.com/r/cIg9zm/1)
<pre>
"[T]?he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in t<a href="#learn-regex"><strong>he</strong></a> garage.
</pre>
"[T]?he" => **The** car is parked in t**he** garage.
[在线练习](https://regex101.com/r/kPpO2x/1)
@ -198,10 +142,7 @@ data: 2022年1月22日
在正则表达式中 `{}` 是一个量词, 常用来一个或一组字符可以重复出现的次数.
例如, 表达式 `[0-9]{2,3}` 匹配 2~3 位 0~9 的数字.
<pre>
"[0-9]{2,3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0.
</pre>
"[0-9]{2,3}" => The number was 9.**999**7 but we rounded it off to **10**.0.
[在线练习](https://regex101.com/r/juM86s/1)
@ -211,15 +152,11 @@ data: 2022年1月22日
如果逗号也省略掉则表示重复固定的次数.
例如, `[0-9]{3}` 匹配3位数字
<pre>
"[0-9]{2,}" => The number was 9.<a href="#learn-regex"><strong>9997</strong></a> but we rounded it off to <a href="#learn-regex"><strong>10</strong></a>.0.
</pre>
"[0-9]{2,}" => The number was 9.**9997** but we rounded it off to **10**.0.
[在线练习](https://regex101.com/r/Gdy4w5/1)
<pre>
"[0-9]{3}" => The number was 9.<a href="#learn-regex"><strong>999</strong></a>7 but we rounded it off to 10.0.
</pre>
"[0-9]{3}" => The number was 9.**999**7 but we rounded it off to 10.0.
[在线练习](https://regex101.com/r/Sivu30/1)
@ -229,9 +166,7 @@ data: 2022年1月22日
我们还可以在 `()` 中用或字符 `|` 表示或. 例如, `(c|g|p)ar` 匹配 `car``gar``par`.
<pre>
"(c|g|p)ar" => The <a href="#learn-regex"><strong>car</strong></a> is <a href="#learn-regex"><strong>par</strong></a>ked in the <a href="#learn-regex"><strong>gar</strong></a>age.
</pre>
"(c|g|p)ar" => The **car** is **par**ked in the **gar**age.
[在线练习](https://regex101.com/r/tUxrBG/1)
@ -241,9 +176,7 @@ data: 2022年1月22日
例如 `(T|t)he|car` 匹配 `(T|t)he``car`.
<pre>
"(T|t)he|car" => <a href="#learn-regex"><strong>The</strong></a> <a href="#learn-regex"><strong>car</strong></a> is parked in <a href="#learn-regex"><strong>the</strong></a> garage.
</pre>
"(T|t)he|car" => **The** **car** is parked in **the** garage.
[在线练习](https://regex101.com/r/fBXyX0/1)
@ -253,9 +186,7 @@ data: 2022年1月22日
例如 `.` 是用来匹配除换行符外的所有字符的. 如果想要匹配句子中的 `.` 则要写成 `\.`.
<pre>
"(f|c|m)at\.?" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> sat on the <a href="#learn-regex"><strong>mat.</strong></a>
</pre>
"(f|c|m)at\.?" => The **fat** **cat** sat on the **mat.**
[在线练习](https://regex101.com/r/DOc5Nu/1)
@ -271,15 +202,11 @@ data: 2022年1月22日
例如, `^(T|t)he` 匹配以 `The``the` 开头的字符串.
<pre>
"(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in <a href="#learn-regex"><strong>the</strong></a> garage.
</pre>
"(T|t)he" => **The** car is parked in **the** garage.
[在线练习](https://regex101.com/r/5ljjgB/1)
<pre>
"^(T|t)he" => <a href="#learn-regex"><strong>The</strong></a> car is parked in the garage.
</pre>
"^(T|t)he" => **The** car is parked in the garage.
[在线练习](https://regex101.com/r/jXrKne/1)
@ -289,15 +216,11 @@ data: 2022年1月22日
例如, `(at\.)$` 匹配以 `at.` 结尾的字符串.
<pre>
"(at\.)" => The fat c<a href="#learn-regex"><strong>at.</strong></a> s<a href="#learn-regex"><strong>at.</strong></a> on the m<a href="#learn-regex"><strong>at.</strong></a>
</pre>
"(at\.)" => The fat c**at.** s**at.** on the m**at.**
[在线练习](https://regex101.com/r/y4Au4D/1)
<pre>
"(at\.)$" => The fat cat. sat. on the m<a href="#learn-regex"><strong>at.</strong></a>
</pre>
"(at\.)$" => The fat cat. sat. on the m**at.**
[在线练习](https://regex101.com/r/t0AkOd/1)
@ -342,9 +265,7 @@ data: 2022年1月22日
前置约束的内容写在括号中的等号后面.
例如, 表达式 `[T|t]he(?=\sfat)` 匹配 `The``the`, 在括号中我们又定义了前置约束(存在) `(?=\sfat)` ,即 `The``the` 后面紧跟着 `(空格)fat`.
<pre>
"[T|t]he(?=\sfat)" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
</pre>
"[T|t]he(?=\sfat)" => **The** fat cat sat on the mat.
[在线练习](https://regex101.com/r/IDDARt/1)
@ -355,9 +276,7 @@ data: 2022年1月22日
表达式 `[T|t]he(?!\sfat)` 匹配 `The``the`, 且其后不跟着 `(空格)fat`.
<pre>
"[T|t]he(?!\sfat)" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat.
</pre>
"[T|t]he(?!\sfat)" => The fat cat sat on **the** mat.
[在线练习](https://regex101.com/r/V32Npg/1)
@ -366,9 +285,7 @@ data: 2022年1月22日
后置约束-存在 记作`(?<=...)` 用于筛选所有匹配结果, 筛选条件为 其前跟随着定义的格式.
例如, 表达式 `(?<=[T|t]he\s)(fat|mat)` 匹配 `fat``mat`, 且其前跟着 `The``the`.
<pre>
"(?<=[T|t]he\s)(fat|mat)" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the <a href="#learn-regex"><strong>mat</strong></a>.
</pre>
"(?<=[T|t]he\s)(fat|mat)" => The **fat** cat sat on the **mat**.
[在线练习](https://regex101.com/r/avH165/1)
@ -377,9 +294,7 @@ data: 2022年1月22日
后置约束-排除 记作 `(?<!...)` 用于筛选所有匹配结果, 筛选条件为 其前不跟着定义的格式.
例如, 表达式 `(?<!(T|t)he\s)(cat)` 匹配 `cat`, 且其前不跟着 `The``the`.
<pre>
"(?&lt;![T|t]he\s)(cat)" => The cat sat on <a href="#learn-regex"><strong>cat</strong></a>.
</pre>
"(?&lt;![T|t]he\s)(cat)" => The cat sat on **cat**.
[在线练习](https://regex101.com/r/8Efx5G/1)
@ -399,15 +314,11 @@ data: 2022年1月22日
修饰语 `i` 用于忽略大小写.
例如, 表达式 `/The/gi` 表示在全局搜索 `The`, 在后面的 `i` 将其条件修改为忽略大小写, 则变成搜索 `the``The`, `g` 表示全局搜索.
<pre>
"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
</pre>
"The" => **The** fat cat sat on the mat.
[在线练习](https://regex101.com/r/dpQyf9/1)
<pre>
"/The/gi" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat.
</pre>
"/The/gi" => **The** fat cat sat on **the** mat.
[在线练习](https://regex101.com/r/ahfiuh/1)
@ -416,15 +327,11 @@ data: 2022年1月22日
修饰符 `g` 常用于执行一个全局搜索匹配, 即(不仅仅返回第一个匹配的, 而是返回全部).
例如, 表达式 `/.(at)/g` 表示搜索 任意字符(除了换行) + `at`, 并返回全部结果.
<pre>
"/.(at)/" => The <a href="#learn-regex"><strong>fat</strong></a> cat sat on the mat.
</pre>
"/.(at)/" => The **fat** cat sat on the mat.
[在线练习](https://regex101.com/r/jnk6gM/1)
<pre>
"/.(at)/g" => The <a href="#learn-regex"><strong>fat</strong></a> <a href="#learn-regex"><strong>cat</strong></a> <a href="#learn-regex"><strong>sat</strong></a> on the <a href="#learn-regex"><strong>mat</strong></a>.
</pre>
"/.(at)/g" => The **fat** **cat** **sat** on the **mat**.
[在线练习](https://regex101.com/r/dO1nef/1)
@ -436,42 +343,18 @@ data: 2022年1月22日
例如, 表达式 `/at(.)?$/gm` 表示在待检测字符串每行的末尾搜索 `at`后跟一个或多个 `.` 的字符串, 并返回全部结果.
<pre>
"/.at(.)?$/" => The fat
cat sat
on the <a href="#learn-regex"><strong>mat.</strong></a>
</pre>
on the **mat.**
[在线练习](https://regex101.com/r/hoGMkP/1)
<pre>
"/.at(.)?$/gm" => The <a href="#learn-regex"><strong>fat</strong></a>
cat <a href="#learn-regex"><strong>sat</strong></a>
on the <a href="#learn-regex"><strong>mat.</strong></a>
</pre>
"/.at(.)?$/gm" => The **fat**
cat **sat**
on the **mat.**
[在线练习](https://regex101.com/r/E88WE2/1)
## 额外补充
* *正整数*: `^\d+$`
* *负整数*: `^-\d+$`
* *手机国家号*: `^+?[\d\s]{3,}$`
* *手机号*: `^+?[\d\s]+(?[\d\s]{10,}$`
* *整数*: `^-?\d+$`
* *用户名*: `^[\w\d_.]{4,16}$`
* *数字和英文字母*: `^[a-zA-Z0-9]*$`
* *数字和应为字母和空格*: `^[a-zA-Z0-9 ]*$`
* *密码*: `^(?=^.{6,}$)((?=.*[A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z]))^.*$`
* *邮箱*: `^([a-zA-Z0-9._%-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4})*$`
* *IP4 地址*: `^((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))*$`
* *纯小写字母*: `^([a-z])*$`
* *纯大写字母*: `^([A-Z])*$`
* *URL*: `^(((http|https|ftp):\/\/)?([[a-zA-Z0-9]\-\.])+(\.)([[a-zA-Z0-9]]){2,4}([[a-zA-Z0-9]\/+=%&_\.~?\-]*))*$`
* *VISA 信用卡号*: `^(4[0-9]{12}(?:[0-9]{3})?)*$`
* *日期 (MM/DD/YYYY)*: `^(0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])[- /.](19|20)?[0-9]{2}$`
* *日期 (YYYY/MM/DD)*: `^(19|20)?[0-9]{2}[- /.](0?[1-9]|1[012])[- /.](0?[1-9]|[12][0-9]|3[01])$`
* *MasterCard 信用卡号*: `^(5[1-5][0-9]{14})*$`
## 贡献
@ -479,4 +362,4 @@ data: 2022年1月22日
## 许可证
MIT &copy; [Zeeshan Ahmad](https://twitter.com/ziishaned)
MIT &copy; [Zeeshan Ahmad](https://twitter.com/ziishaned)

View File

@ -3,7 +3,7 @@ id: 常用正则大全
title: 常用正则大全
data: 2022年1月22日
---
## 常用正则大全
- [regex101正则表达式测试工具](https://regex101.com/)
- [REGEXP正则表达式测试工具](https://regexr.com/)
- [Regulex正则表达式可视化工具](https://jex.im/regulex)