mirror of
https://github.com/ziishaned/learn-regex.git
synced 2025-08-04 18:46:40 -04:00
commit
75a5ac9585
@ -41,8 +41,8 @@
|
|||||||
> 正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。
|
> 正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。
|
||||||
|
|
||||||
一个正则表达式是一种从左到右匹配主体字符串的模式。
|
一个正则表达式是一种从左到右匹配主体字符串的模式。
|
||||||
“Regular expression”这个词比较拗口,我们常使用缩写的术语“regex”或“regexp”。
|
|
||||||
正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串、验证表单、提取字符串等等。
|
正则表达式可以从一个基础字符串中根据一定的匹配模式替换文本中的字符串、验证表单、提取字符串等等。
|
||||||
|
“Regular expression”这个词比较拗口,我们常使用缩写的术语“regex”或“regexp”。
|
||||||
|
|
||||||
想象你正在写一个应用,然后你想设定一个用户命名的规则,让用户名包含字符、数字、下划线和连字符,以及限制字符的个数,好让名字看起来没那么丑。
|
想象你正在写一个应用,然后你想设定一个用户命名的规则,让用户名包含字符、数字、下划线和连字符,以及限制字符的个数,好让名字看起来没那么丑。
|
||||||
我们使用以下正则表达式来验证一个用户名:
|
我们使用以下正则表达式来验证一个用户名:
|
||||||
@ -121,14 +121,14 @@
|
|||||||
|[ ]|字符种类。匹配方括号内的任意字符。|
|
|[ ]|字符种类。匹配方括号内的任意字符。|
|
||||||
|[^ ]|否定的字符种类。匹配除了方括号里的任意字符|
|
|[^ ]|否定的字符种类。匹配除了方括号里的任意字符|
|
||||||
|*|匹配 >=0 个重复的在 * 号之前的字符。|
|
|*|匹配 >=0 个重复的在 * 号之前的字符。|
|
||||||
|+|匹配>=1个重复的+号前的字符。
|
|+|匹配 >=1 个重复的 + 号前的字符。|
|
||||||
|?|标记?之前的字符为可选.|
|
|?|标记 ? 之前的字符为可选。|
|
||||||
|{n,m}|匹配num个大括号之前的字符或字符集 (n <= num <= m).|
|
|{n,m}|匹配 num 个大括号之前的字符或字符集 (n <= num <= m)。|
|
||||||
|(xyz)|字符集,匹配与 xyz 完全相等的字符串.|
|
|(xyz)|字符集,匹配与 xyz 完全相等的字符串。|
|
||||||
|||或运算符,匹配符号前或后的字符.|
|
|||或运算符,匹配符号前或后的字符。|
|
||||||
|\|转义字符,用于匹配一些保留的字符 <code>[ ] ( ) { } . * + ? ^ $ \ |</code>|
|
|\|转义字符,用于匹配一些保留的字符 <code>[ ] ( ) { } . * + ? ^ $ \ |</code>|
|
||||||
|^|从开始行开始匹配.|
|
|^|从开始行开始匹配。|
|
||||||
|$|从末端开始匹配.|
|
|$|从末端开始匹配。|
|
||||||
|
|
||||||
## 2.1 点运算符 `.`
|
## 2.1 点运算符 `.`
|
||||||
|
|
||||||
@ -157,7 +157,7 @@
|
|||||||
[在线练习](https://regex101.com/r/2ITLQ4/1)
|
[在线练习](https://regex101.com/r/2ITLQ4/1)
|
||||||
|
|
||||||
方括号的句号就表示句号。
|
方括号的句号就表示句号。
|
||||||
表达式 `ar[.]` 匹配 `ar.`字符串
|
表达式 `ar[.]` 匹配 `ar.` 字符串。
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
"ar[.]" => A garage is a good place to park a c<a href="#learn-regex"><strong>ar.</strong></a>
|
"ar[.]" => A garage is a good place to park a c<a href="#learn-regex"><strong>ar.</strong></a>
|
||||||
@ -242,6 +242,8 @@
|
|||||||
|
|
||||||
我们可以省略第二个参数。
|
我们可以省略第二个参数。
|
||||||
例如,`[0-9]{2,}` 匹配至少两位 0~9 的数字。
|
例如,`[0-9]{2,}` 匹配至少两位 0~9 的数字。
|
||||||
|
如果逗号也省略掉则表示重复固定的次数。
|
||||||
|
例如,`[0-9]{3}` 匹配 3 位数字。
|
||||||
|
|
||||||
<pre>
|
<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.
|
"[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.
|
||||||
@ -249,20 +251,19 @@
|
|||||||
|
|
||||||
[在线练习](https://regex101.com/r/Gdy4w5/1)
|
[在线练习](https://regex101.com/r/Gdy4w5/1)
|
||||||
|
|
||||||
如果逗号也省略掉则表示重复固定的次数。
|
|
||||||
例如,`[0-9]{3}` 匹配3位数字
|
|
||||||
|
|
||||||
<pre>
|
<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.
|
"[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>
|
</pre>
|
||||||
|
|
||||||
[在线练习](https://regex101.com/r/Sivu30/1)
|
[在线练习](https://regex101.com/r/Sivu30/1)
|
||||||
|
|
||||||
## 2.5 `(...)` 特征标群
|
## 2.5 `(...)` 捕获组
|
||||||
|
|
||||||
特征标群是一组写在 `(...)` 中的子模式。`(...)` 中包含的内容将会被看成一个整体,和数学中小括号( )的作用相同。例如, 表达式 `(ab)*` 匹配连续出现 0 或更多个 `ab`。如果没有使用 `(...)` ,那么表达式 `ab*` 将匹配连续出现 0 或更多个 `b` 。再比如之前说的 `{}` 是用来表示前面一个字符出现指定次数。但如果在 `{}` 前加上特征标群 `(...)` 则表示整个标群内的字符重复 N 次。
|
|
||||||
|
|
||||||
|
|
||||||
|
特征标群是一组写在 `(...)` 中的子模式。`(...)` 中包含的内容将会被看成一个整体,和数学中小括号( )的作用相同。
|
||||||
|
例如,表达式 `(ab)*` 匹配连续出现 0 或更多个 `ab`。
|
||||||
|
如果没有使用 `(...)` ,那么表达式 `ab*` 将匹配连续出现 0 或更多个 `b`。
|
||||||
|
再比如之前说的 `{}` 是用来表示前面一个字符出现指定次数。
|
||||||
|
但如果在 `{}` 前加上特征标群 `(...)` 则表示整个标群内的字符重复 N 次。
|
||||||
我们还可以在 `()` 中用或字符 `|` 表示或。例如,`(c|g|p)ar` 匹配 `car` 或 `gar` 或 `par`.
|
我们还可以在 `()` 中用或字符 `|` 表示或。例如,`(c|g|p)ar` 匹配 `car` 或 `gar` 或 `par`.
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
@ -271,6 +272,22 @@
|
|||||||
|
|
||||||
[在线练习](https://regex101.com/r/tUxrBG/1)
|
[在线练习](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 `|` 或运算符
|
## 2.6 `|` 或运算符
|
||||||
|
|
||||||
或运算符就表示或,用作判断条件。
|
或运算符就表示或,用作判断条件。
|
||||||
@ -283,11 +300,14 @@
|
|||||||
|
|
||||||
[在线练习](https://regex101.com/r/fBXyX0/1)
|
[在线练习](https://regex101.com/r/fBXyX0/1)
|
||||||
|
|
||||||
## 2.7 转码特殊字符
|
## 2.7 转义特殊字符
|
||||||
|
|
||||||
反斜线 `\` 在表达式中用于转码紧跟其后的字符。用于指定 `{ } [ ] / \ + * . $ ^ | ?` 这些特殊字符。如果想要匹配这些特殊字符则要在其前面加上反斜线 `\`。
|
反斜线 `\` 在表达式中用于转义紧跟其后的字符。
|
||||||
|
用于指定 `{ } [ ] / \ + * . $ ^ | ?` 这些特殊字符。
|
||||||
|
如果想要匹配这些特殊字符则要在其前面加上反斜线 `\`。
|
||||||
|
|
||||||
例如 `.` 是用来匹配除换行符外的所有字符的。如果想要匹配句子中的 `.` 则要写成 `\.` 以下这个例子 `\.?`是选择性匹配`.`
|
例如 `.` 是用来匹配除换行符外的所有字符的。如果想要匹配句子中的 `.` 则要写成 `\.`。
|
||||||
|
以下这个例子 `\.?` 是选择性匹配 `.`。
|
||||||
|
|
||||||
<pre>
|
<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>
|
"(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>
|
||||||
@ -303,7 +323,9 @@
|
|||||||
|
|
||||||
`^` 用来检查匹配的字符串是否在所匹配字符串的开头。
|
`^` 用来检查匹配的字符串是否在所匹配字符串的开头。
|
||||||
|
|
||||||
例如,在 `abc` 中使用表达式 `^a` 会得到结果 `a`。但如果使用 `^b` 将匹配不到任何结果。因为在字符串 `abc` 中并不是以 `b` 开头。
|
例如,在 `abc` 中使用表达式 `^a` 会得到结果 `a`。
|
||||||
|
但如果使用 `^b` 将匹配不到任何结果。
|
||||||
|
因为字符串 `abc` 并不是以 b 开头。
|
||||||
|
|
||||||
例如,`^(T|t)he` 匹配以 `The` 或 `the` 开头的字符串。
|
例如,`^(T|t)he` 匹配以 `The` 或 `the` 开头的字符串。
|
||||||
|
|
||||||
@ -374,7 +396,7 @@
|
|||||||
|
|
||||||
### 4.1 `?=...` 正先行断言
|
### 4.1 `?=...` 正先行断言
|
||||||
|
|
||||||
`?=...` 正先行断言,表示第一部分表达式之后必须跟着 `?=...`定义的表达式。
|
`?=...` 正先行断言,表示第一部分表达式之后必须跟着 `?=...` 定义的表达式(正先行断言)。
|
||||||
|
|
||||||
返回结果只包含满足匹配条件的第一部分表达式。
|
返回结果只包含满足匹配条件的第一部分表达式。
|
||||||
定义一个正先行断言要使用 `()`。在括号内部使用一个问号和等号: `(?=...)`。
|
定义一个正先行断言要使用 `()`。在括号内部使用一个问号和等号: `(?=...)`。
|
||||||
@ -403,7 +425,7 @@
|
|||||||
|
|
||||||
### 4.3 `?<= ...` 正后发断言
|
### 4.3 `?<= ...` 正后发断言
|
||||||
|
|
||||||
正后发断言 记作`(?<=...)` 用于筛选所有匹配结果,筛选条件为 其前跟随着断言中定义的格式。
|
正后发断言记作 `(?<=...)`,用于筛选所有匹配结果,筛选条件为 其前跟随着断言中定义的格式。
|
||||||
例如,表达式 `(?<=(T|t)he\s)(fat|mat)` 匹配 `fat` 和 `mat`,且其前跟着 `The` 或 `the`。
|
例如,表达式 `(?<=(T|t)he\s)(fat|mat)` 匹配 `fat` 和 `mat`,且其前跟着 `The` 或 `the`。
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
@ -414,7 +436,7 @@
|
|||||||
|
|
||||||
### 4.4 `?<!...` 负后发断言
|
### 4.4 `?<!...` 负后发断言
|
||||||
|
|
||||||
负后发断言 记作 `(?<!...)` 用于筛选所有匹配结果,筛选条件为 其前不跟随着断言中定义的格式。
|
负后发断言记作 `(?<!...)`,用于筛选所有匹配结果,筛选条件为 其前不跟随着断言中定义的格式。
|
||||||
例如,表达式 `(?<!(T|t)he\s)(cat)` 匹配 `cat`,且其前不跟着 `The` 或 `the`。
|
例如,表达式 `(?<!(T|t)he\s)(cat)` 匹配 `cat`,且其前不跟着 `The` 或 `the`。
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user