doc: update regex.md
cheatsheet.
This commit is contained in:
parent
9ff36a3ac3
commit
a341f2e1ad
251
docs/regex.md
251
docs/regex.md
@ -17,19 +17,21 @@ RegEX 备忘清单
|
|||||||
- [MySQL 中的 Regex](#mysql中的正则表达式) _(Quick Reference)_
|
- [MySQL 中的 Regex](#mysql中的正则表达式) _(Quick Reference)_
|
||||||
- [Vim 中的 Regex](./vim#vim-搜索和替换) _(Quick Reference)_
|
- [Vim 中的 Regex](./vim#vim-搜索和替换) _(Quick Reference)_
|
||||||
- [在线 Regex 测试器](https://regex101.com/) _(regex101.com)_
|
- [在线 Regex 测试器](https://regex101.com/) _(regex101.com)_
|
||||||
|
- [轻松学习 Regex](https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md) _(github.com)_
|
||||||
|
- [正则表达式实例搜集](https://jaywcjlove.github.io/regexp-example) _(jaywcjlove.github.io)_
|
||||||
<!--rehype:className=cols-2-->
|
<!--rehype:className=cols-2-->
|
||||||
|
|
||||||
### 字符类
|
### 字符类
|
||||||
|
|
||||||
范例 | 说明
|
范例 | 说明
|
||||||
:-|-
|
:-|-
|
||||||
`[abc]` | 单个字符:a、b 或 c
|
`[abc]` | 单个字符:`a`、`b` 或 `c`
|
||||||
`[^abc]` | 一个字符,除了:a、b 或 c
|
`[^abc]` | 一个字符,除了:`a`、`b` 或 `c`
|
||||||
`[a-z]` | 范围内的字符:a-z
|
`[a-z]` | 范围内的字符:`a-z`
|
||||||
`[^a-z]` | 不在范围内的字符:a-z
|
`[^a-z]` | 不在范围内的字符:`a-z`
|
||||||
`[0-9]` | 范围内的数字:0-9
|
`[0-9]` | 范围内的数字:`0-9`
|
||||||
`[a-zA-Z]` | 范围内的字符:<br>a-z 或 A-Z
|
`[a-zA-Z]` | 范围内的字符:<br>`a-z` 或 `A-Z`
|
||||||
`[a-zA-Z0-9]` | 范围内的字符:<br>a-z、A-Z 或 0-9
|
`[a-zA-Z0-9]` | 范围内的字符:<br>`a-z`、`A-Z` 或 `0-9`
|
||||||
|
|
||||||
|
|
||||||
### 量词
|
### 量词
|
||||||
@ -181,6 +183,10 @@ RegEX 备忘清单
|
|||||||
`(?!...)` | 负先行断言
|
`(?!...)` | 负先行断言
|
||||||
`(?<=...)` | 正后发断言
|
`(?<=...)` | 正后发断言
|
||||||
`(?<!...)` | 负后发断言
|
`(?<!...)` | 负后发断言
|
||||||
|
`?= `|正先行断言-存在
|
||||||
|
`?! `|负先行断言-排除
|
||||||
|
`?<=`|正后发断言-存在
|
||||||
|
`?<!`|负后发断言-排除
|
||||||
|
|
||||||
零宽度断言 允许您在主模式之前(向后看)或之后(lookahead)匹配一个组,而不会将其包含在结果中。
|
零宽度断言 允许您在主模式之前(向后看)或之后(lookahead)匹配一个组,而不会将其包含在结果中。
|
||||||
|
|
||||||
@ -401,12 +407,9 @@ RegEX 备忘清单
|
|||||||
|
|
||||||
"id" 匹配,但 `\b` 在原子组之后失败,
|
"id" 匹配,但 `\b` 在原子组之后失败,
|
||||||
解析器不会回溯到组以重试“身份”
|
解析器不会回溯到组以重试“身份”
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
如果替代品重叠,请从长到短命令。
|
如果替代品重叠,请从长到短命令。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 零宽度断言 Lookaround(前后预查)
|
### 零宽度断言 Lookaround(前后预查)
|
||||||
<!--rehype:wrap-class=col-span-2 row-span-2-->
|
<!--rehype:wrap-class=col-span-2 row-span-2-->
|
||||||
|
|
||||||
@ -431,8 +434,225 @@ RegEX 备忘清单
|
|||||||
M(?(?=.*?\bher\b)s|r)\.
|
M(?(?=.*?\bher\b)s|r)\.
|
||||||
```
|
```
|
||||||
|
|
||||||
需要环顾 IF 条件
|
需要环顾 `IF` 条件
|
||||||
|
|
||||||
|
基础实例
|
||||||
|
---
|
||||||
|
|
||||||
|
### 基本匹配
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`the` | The fat cat sat on `the` mat.
|
||||||
|
`The` | `The` fat cat sat on the mat.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
由字母`t`开始,接着是`h`,再接着是`e`
|
||||||
|
|
||||||
|
### 点运算符 `.`
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`.ar` | The `car` `par`ked in the `gar`age.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
表达式`.ar`匹配一个任意字符后面跟着是`a`和`r`的字符串
|
||||||
|
|
||||||
|
### 字符集
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`.ar` | The `car` `par`ked in the `gar`age.
|
||||||
|
`ar[.]` | A garage is a good place to park a c`ar`.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
方括号的句号就表示句号。表达式 `ar[.]` 匹配 `ar.` 字符串
|
||||||
|
|
||||||
|
### 否定字符集
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`[^c]ar` | The car `par`ked in the `gar`age.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
表达式 `[^c]ar` 匹配一个后面跟着 `ar` 的除了`c`的任意字符。
|
||||||
|
|
||||||
|
### 重复次数
|
||||||
|
<!--rehype:wrap-class=row-span-2-->
|
||||||
|
|
||||||
|
#### `*` 号
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`[a-z]*` | T`he` `car` `parked` `in` `the` `garage` #21.
|
||||||
|
`\s*cat\s*` | The fat `cat` sat on the con`cat`enation.
|
||||||
|
|
||||||
|
表达式 `[a-z]*` 匹配一个行中所有以小写字母开头的字符串。
|
||||||
|
|
||||||
|
#### `+` 号
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`c.+t` | The `fat cat sat on the mat`.
|
||||||
|
|
||||||
|
表达式 `c.+t` 匹配以首字母c开头以t结尾,中间跟着至少一个字符的字符串。
|
||||||
|
|
||||||
|
#### `?` 号
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`[T]he` | `The` car is parked in the garage.
|
||||||
|
`[T]?he` | `The` car is parked in t`he` garage.
|
||||||
|
|
||||||
|
表达式 `[T]?he` 匹配字符串 `he` 和 `The`。
|
||||||
|
|
||||||
|
### `{}` 号
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`[0-9]{2,3}` | The number was 9.`999`7 but we rounded it off to `10`.0.
|
||||||
|
`[0-9]{2,}` | The number was 9.`9997` but we rounded it off to `10`.0.
|
||||||
|
`[0-9]{3}` | The number was 9.`999`7 but we rounded it off to 10.0.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
### `(...)` 特征标群
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`(c\|g\|p)ar` | The `car` is `par`ked in the `gar`age.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
表达式 `(c|g|p)ar` 匹配 `car` 或 `gar` 或 `par`。 注意 `\` 是在 Markdown 中为了不破坏表格转义 `|`。
|
||||||
|
|
||||||
|
### `|` 或运算符
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`(T\|t)he\|car` | The car is parked in the garage.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
表达式 `(T|t)he|car` 匹配 `(T|t)he` 或 `car`
|
||||||
|
|
||||||
|
### 转码特殊字符
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`(f\|c\|m)at\.?` | The `fat` `cat` sat on the `mat.`
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
如果想要匹配句子中的 `.` 则要写成 `\.` 以下这个例子 `\.?` 是选择性匹配.
|
||||||
|
|
||||||
|
### 锚点
|
||||||
|
|
||||||
|
#### `^` 号
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`(T\|t)he` | `The` car is parked in `the` garage.
|
||||||
|
`^(T\|t)he` | `The` car is parked in the garage.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
#### `$` 号
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`(at\.)` | The fat c`at.` s`at.` on the m`at.`
|
||||||
|
`(at\.)$` | The fat cat. sat. on the m`at`.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
### 简写字符集
|
||||||
|
<!--rehype:wrap-class=row-span-3-->
|
||||||
|
|
||||||
|
|简写|描述|
|
||||||
|
|:----:|----|
|
||||||
|
|`.`|除换行符外的所有字符|
|
||||||
|
|`\w`|匹配所有字母数字,等同于 `[a-zA-Z0-9_]`|
|
||||||
|
|`\W`|匹配所有非字母数字,即符号,等同于: `[^\w]`|
|
||||||
|
|`\d`|匹配数字: `[0-9]`|
|
||||||
|
|`\D`|匹配非数字: `[^\d]`|
|
||||||
|
|`\s`|匹配所有空格字符,等同于: `[\t\n\f\r\p{Z}]`|
|
||||||
|
|`\S`|匹配所有非空格字符: `[^\s]`|
|
||||||
|
|`\f`|匹配一个换页符|
|
||||||
|
|`\n`|匹配一个换行符|
|
||||||
|
|`\r`|匹配一个回车符|
|
||||||
|
|`\t`|匹配一个制表符|
|
||||||
|
|`\v`|匹配一个垂直制表符|
|
||||||
|
|`\p`|匹配 CR/LF(等同于 `\r\n`),用来匹配 DOS 行终止符|
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
正则表达式提供一些常用的字符集简写。
|
||||||
|
|
||||||
|
### `?=...` 正先行断言
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`(T\|t)he(?=\sfat)` | `The` fat cat sat on the mat.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
`The` 和 `the` 后面紧跟着 `(空格)fat`。
|
||||||
|
|
||||||
|
### `?!...` 负先行断言
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`(T\|t)he(?!\sfat)` | The fat cat sat on `the` mat.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
匹配 `The` 和 `the`,且其后不跟着 `(空格)fat`。
|
||||||
|
|
||||||
|
### `?<= ...` 正后发断言
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`(?<=(T\|t)he\s)(fat\|mat)` | The `fat` cat sat on the `mat`.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
匹配 `fat` 和 `mat`,且其前跟着 `The` 或 `the`。
|
||||||
|
|
||||||
|
### `?<!...` 负后发断言
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`(?<!(T\|t)he\s)(cat)` | The cat sat on `cat`.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
匹配 `cat`,且其前不跟着 `The` 或 `the`。
|
||||||
|
|
||||||
|
### 忽略大小写 (Case Insensitive)
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`The` | The `fat` cat sat on the mat.
|
||||||
|
`/The/gi` | The `fat` `cat` `sat` on the `mat`.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
修饰语 `i` 用于忽略大小写,`g` 表示全局搜索。
|
||||||
|
|
||||||
|
### 全局搜索 (Global search)
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`/.(at)/` | The `fat` cat sat on the mat.
|
||||||
|
`/.(at)/g` | The `fat` `cat` `sat` on the `mat`.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
表达式 `/.(at)/g` 表示搜索 任意字符(除了换行)+ `at`,并返回全部结果。
|
||||||
|
|
||||||
|
### 多行修饰符 (Multiline)
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`/.at(.)?$/` | The fat<br /> cat sat<br /> on the `mat`.
|
||||||
|
`/.at(.)?$/gm` | The `fat`<br /> cat `sat`<br /> on the `mat`.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
|
### 贪婪匹配与惰性匹配 (Greedy vs lazy matching)
|
||||||
|
|
||||||
|
表达式 | 匹配示例
|
||||||
|
:- | -
|
||||||
|
`/(.*at)/` | `The fat cat sat on the mat`.
|
||||||
|
`/(.*?at)/` | `The fat` cat sat on the mat.
|
||||||
|
<!--rehype:className=show-header-->
|
||||||
|
|
||||||
Python 中的正则表达式
|
Python 中的正则表达式
|
||||||
---------------
|
---------------
|
||||||
@ -921,3 +1141,10 @@ mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 2);
|
|||||||
mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 3, 1);
|
mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 3, 1);
|
||||||
7
|
7
|
||||||
```
|
```
|
||||||
|
|
||||||
|
也可以看看
|
||||||
|
----------
|
||||||
|
|
||||||
|
- [轻松学习 Regex](https://github.com/ziishaned/learn-regex/blob/master/translations/README-cn.md) _(github.com)_
|
||||||
|
- [正则表达式实例搜集](https://jaywcjlove.github.io/regexp-example) _(jaywcjlove.github.io)_
|
||||||
|
- [一些正则表达式随记](https://github.com/jaywcjlove/handbook/blob/master/docs/JavaScript/RegExp.md) _(jaywcjlove.github.io)_
|
||||||
|
Loading…
x
Reference in New Issue
Block a user