Update README-cn.md

This commit is contained in:
Cygra 2022-05-02 12:32:42 +08:00
parent b02f98adda
commit 3497a310c3

View File

@ -18,6 +18,7 @@
## 翻译:
* [English](../README.md)
* [German](../translations/README-de.md)
* [Español](../translations/README-es.md)
* [Français](../translations/README-fr.md)
* [Português do Brasil](../translations/README-pt_BR.md)
@ -40,8 +41,8 @@
> 正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。
一个正则表达式是一种从左到右匹配主体字符串的模式。
“Regular expression”这个词比较拗口我们常使用缩写的术语“regex”或“regexp”。
正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串、验证表单、提取字符串等等。
“Regular expression”这个词比较拗口我们常使用缩写的术语“regex”或“regexp”。
想象你正在写一个应用,然后你想设定一个用户命名的规则,让用户名包含字符、数字、下划线和连字符,以及限制字符的个数,好让名字看起来没那么丑。
我们使用以下正则表达式来验证一个用户名:
@ -91,7 +92,7 @@
## 1. 基本匹配
正则表达式其实就是在执行搜索时的格式,它由一些字母和数字组合而成。
例如:一个正则表达式 `the`,它表示一个规则:由字母`t`开始,接着是`h`,再接着是`e`
例如:一个正则表达式 `the`,它表示一个规则:由字母 `t` 开始,接着是 `h`,再接着是 `e`
<pre>
"the" => The fat cat sat on <a href="#learn-regex"><strong>the</strong></a> mat.
@ -99,9 +100,9 @@
[在线练习](https://regex101.com/r/dmRygT/1)
正则表达式`123`匹配字符串`123`。它逐个字符的与输入的正则表达式做比较。
正则表达式 `123` 匹配字符串 `123`。它逐个字符的与输入的正则表达式做比较。
正则表达式是大小写敏感的,所以`The`不会匹配`the`
正则表达式是大小写敏感的,所以 `The` 不会匹配 `the`
<pre>
"The" => <a href="#learn-regex"><strong>The</strong></a> fat cat sat on the mat.
@ -119,21 +120,21 @@
|.|句号匹配任意单个字符除了换行符。|
|[ ]|字符种类。匹配方括号内的任意字符。|
|[^ ]|否定的字符种类。匹配除了方括号里的任意字符|
|*|匹配>=0个重复的在*号之前的字符。|
|+|匹配>=1个重复的+号前的字符。
|?|标记?之前的字符为可选.|
|{n,m}|匹配num个大括号之前的字符或字符集 (n <= num <= m).|
|(xyz)|字符集,匹配与 xyz 完全相等的字符串.|
|&#124;|或运算符,匹配符号前或后的字符.|
|&#92;|转义字符,用于匹配一些保留的字符 <code>[ ] ( ) { } . * + ? ^ $ \ &#124;</code>|
|^|从开始行开始匹配.|
|$|从末端开始匹配.|
|*|匹配 >=0 个重复的在 * 号之前的字符。|
|+|匹配 >=1 个重复的 + 号前的字符。|
|?|标记 ? 之前的字符为可选。|
|{n,m}|匹配 num 个大括号之前的字符或字符集 (n <= num <= m)|
|(xyz)|字符集,匹配与 xyz 完全相等的字符串|
|&#124;|或运算符,匹配符号前或后的字符|
|&#92;|转义字符用于匹配一些保留的字符 <code>[ ] ( ) { } . * + ? ^ $ \ &#124;</code>|
|^|从开始行开始匹配|
|$|从末端开始匹配|
## 2.1 点运算符 `.`
`.`是元字符中最简单的例子。
`.`匹配任意单个字符,但不匹配换行符。
例如,表达式`.ar`匹配一个任意字符后面跟着是`a``r`的字符串。
`.` 是元字符中最简单的例子。
`.` 匹配任意单个字符,但不匹配换行符。
例如,表达式 `.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.
@ -147,7 +148,7 @@
方括号用来指定一个字符集。
在方括号中使用连字符来指定字符集的范围。
在方括号中的字符集不关心顺序。
例如,表达式`[Tt]he` 匹配 `the``The`
例如,表达式 `[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.
@ -156,7 +157,7 @@
[在线练习](https://regex101.com/r/2ITLQ4/1)
方括号的句号就表示句号。
表达式 `ar[.]` 匹配 `ar.`字符串
表达式 `ar[.]` 匹配 `ar.` 字符串
<pre>
"ar[.]" => A garage is a good place to park a c<a href="#learn-regex"><strong>ar.</strong></a>
@ -167,7 +168,7 @@
### 2.2.1 否定字符集
一般来说 `^` 表示一个字符串的开头,但它用在一个方括号的开头的时候,它表示这个字符集是否定的。
例如,表达式`[^c]ar` 匹配一个后面跟着`ar`的除了`c`的任意字符。
例如,表达式 `[^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.
@ -182,8 +183,8 @@
### 2.3.1 `*`
`*`号匹配 `*`之前的字符出现`大于等于0`次。
例如,表达式 `a*` 匹配0或更多个以a开头的字符。表达式`[a-z]*` 匹配一个行中所有以小写字母开头的字符串。
`*` 号匹配在 `*` 之前的字符出现 `大于等于0` 次。
例如,表达式 `a*` 匹配 0 或更多个以 a 开头的字符。表达式 `[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.
@ -191,8 +192,8 @@
[在线练习](https://regex101.com/r/7m8me5/1)
`*`字符和`.`字符搭配可以匹配所有的字符`.*`
`*`和表示匹配空格的符号`\s`连起来用,如表达式`\s*cat\s*`匹配0或更多个空格开头和0或更多个空格结尾的cat字符串。
`*` 字符和 `.` 字符搭配可以匹配所有的字符 `.*`
`*` 和表示匹配空格的符号 `\s` 连起来用,如表达式 `\s*cat\s*` 匹配 0 或更多个空格开头和 0 或更多个空格结尾的 cat 字符串。
<pre>
"\s*cat\s*" => The fat<a href="#learn-regex"><strong> cat </strong></a>sat on the con<a href="#learn-regex"><strong>cat</strong></a>enation.
@ -202,8 +203,8 @@
### 2.3.2 `+`
`+`号匹配`+`号之前的字符出现 >=1 次。
例如表达式`c.+t` 匹配以首字母`c`开头以`t`结尾,中间跟着至少一个字符的字符串。
`+` 号匹配 `+` 号之前的字符出现 >=1 次。
例如表达式 `c.+t` 匹配以首字母 `c` 开头以 `t` 结尾,中间跟着至少一个字符的字符串。
<pre>
"c.+t" => The fat <a href="#learn-regex"><strong>cat sat on the mat</strong></a>.
@ -231,7 +232,7 @@
## 2.4 `{}`
在正则表达式中 `{}` 是一个量词,常用来限定一个或一组字符可以重复出现的次数。
例如, 表达式 `[0-9]{2,3}` 匹配最少 2 位最多 3 位 0~9 的数字。
例如,表达式 `[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.
@ -241,6 +242,8 @@
我们可以省略第二个参数。
例如,`[0-9]{2,}` 匹配至少两位 0~9 的数字。
如果逗号也省略掉则表示重复固定的次数。
例如,`[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.
@ -248,20 +251,19 @@
[在线练习](https://regex101.com/r/Gdy4w5/1)
如果逗号也省略掉则表示重复固定的次数。
例如,`[0-9]{3}` 匹配3位数字
<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>
[在线练习](https://regex101.com/r/Sivu30/1)
## 2.5 `(...)` 特征标群
特征标群是一组写在 `(...)` 中的子模式。`(...)` 中包含的内容将会被看成一个整体,和数学中小括号( )的作用相同。例如, 表达式 `(ab)*` 匹配连续出现 0 或更多个 `ab`。如果没有使用 `(...)` ,那么表达式 `ab*` 将匹配连续出现 0 或更多个 `b` 。再比如之前说的 `{}` 是用来表示前面一个字符出现指定次数。但如果在 `{}` 前加上特征标群 `(...)` 则表示整个标群内的字符重复 N 次。
## 2.5 `(...)` 捕获组
特征标群是一组写在 `(...)` 中的子模式。`(...)` 中包含的内容将会被看成一个整体,和数学中小括号( )的作用相同。
例如,表达式 `(ab)*` 匹配连续出现 0 或更多个 `ab`
如果没有使用 `(...)` ,那么表达式 `ab*` 将匹配连续出现 0 或更多个 `b`
再比如之前说的 `{}` 是用来表示前面一个字符出现指定次数。
但如果在 `{}` 前加上特征标群 `(...)` 则表示整个标群内的字符重复 N 次。
我们还可以在 `()` 中用或字符 `|` 表示或。例如,`(c|g|p)ar` 匹配 `car``gar``par`.
<pre>
@ -270,6 +272,22 @@
[在线练习](https://regex101.com/r/tUxrBG/1)
请注意,特征标群不仅会匹配,而且会捕获,可以在宿主语言中被引用。
宿主语言可以是 Python 或 JavaScript 或几乎任何在函数定义中实现正则表达式的语言。
### 2.5.1 非捕获组
非捕获组匹配字符但不捕获该组。 一个非捕获组由在括号 `...` 内的一个 `?` 后跟一个 `:` 表示。 例如,正则表达式 `(?:c|g|p)ar``(c|g|p)ar` 类似,可以匹配相同的字符,但不会创建捕获组。
<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>
[在线练习](https://regex101.com/r/Rm7Me8/1)
非捕获组用于查找和替换功能,或与捕获组混合以在生成任何其他类型的输出的时候,不记录匹配的内容。
可参考 [4. 零宽度断言(前后预查)](#4-零宽度断言前后预查)。
## 2.6 `|` 或运算符
或运算符就表示或,用作判断条件。
@ -282,11 +300,14 @@
[在线练习](https://regex101.com/r/fBXyX0/1)
## 2.7 转特殊字符
## 2.7 转特殊字符
反斜线 `\` 在表达式中用于转码紧跟其后的字符。用于指定 `{ } [ ] / \ + * . $ ^ | ?` 这些特殊字符。如果想要匹配这些特殊字符则要在其前面加上反斜线 `\`
反斜线 `\` 在表达式中用于转义紧跟其后的字符。
用于指定 `{ } [ ] / \ + * . $ ^ | ?` 这些特殊字符。
如果想要匹配这些特殊字符则要在其前面加上反斜线 `\`
例如 `.` 是用来匹配除换行符外的所有字符的。如果想要匹配句子中的 `.` 则要写成 `\.` 以下这个例子 `\.?`是选择性匹配`.`
例如 `.` 是用来匹配除换行符外的所有字符的。如果想要匹配句子中的 `.` 则要写成 `\.`
以下这个例子 `\.?` 是选择性匹配 `.`
<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>
@ -302,7 +323,9 @@
`^` 用来检查匹配的字符串是否在所匹配字符串的开头。
例如,在 `abc` 中使用表达式 `^a` 会得到结果 `a`。但如果使用 `^b` 将匹配不到任何结果。因为在字符串 `abc` 中并不是以 `b` 开头。
例如,在 `abc` 中使用表达式 `^a` 会得到结果 `a`
但如果使用 `^b` 将匹配不到任何结果。
因为字符串 `abc` 并不是以 b 开头。
例如,`^(T|t)he` 匹配以 `The``the` 开头的字符串。
@ -373,7 +396,7 @@
### 4.1 `?=...` 正先行断言
`?=...` 正先行断言,表示第一部分表达式之后必须跟着 `?=...`定义的表达式。
`?=...` 正先行断言,表示第一部分表达式之后必须跟着 `?=...` 定义的表达式(正先行断言)
返回结果只包含满足匹配条件的第一部分表达式。
定义一个正先行断言要使用 `()`。在括号内部使用一个问号和等号: `(?=...)`
@ -389,7 +412,7 @@
### 4.2 `?!...` 负先行断言
负先行断言 `?!` 用于筛选所有匹配结果,筛选条件为 其后不跟随着断言中定义的格式。
负先行断言 `?!` 用于筛选所有匹配结果,筛选条件为其后 不跟随着断言中定义的格式。
`正先行断言` 定义和 `负先行断言` 一样,区别就是 `=` 替换成 `!` 也就是 `(?!...)`
表达式 `(T|t)he(?!\sfat)` 匹配 `The``the`,且其后不跟着 `(空格)fat`
@ -402,7 +425,7 @@
### 4.3 `?<= ...` 正后发断言
正后发断言 记作`(?<=...)` 用于筛选所有匹配结果,筛选条件为 其前跟随着断言中定义的格式。
正后发断言记作 `(?<=...)`用于筛选所有匹配结果,筛选条件为 其前跟随着断言中定义的格式。
例如,表达式 `(?<=(T|t)he\s)(fat|mat)` 匹配 `fat``mat`,且其前跟着 `The``the`
<pre>
@ -413,7 +436,7 @@
### 4.4 `?<!...` 负后发断言
负后发断言 记作 `(?<!...)` 用于筛选所有匹配结果,筛选条件为 其前不跟随着断言中定义的格式。
负后发断言记作 `(?<!...)`用于筛选所有匹配结果,筛选条件为 其前不跟随着断言中定义的格式。
例如,表达式 `(?<!(T|t)he\s)(cat)` 匹配 `cat`,且其前不跟着 `The``the`
<pre>