From 7f4e2f5b1cf3f5087d10805c3c6b892d907fa953 Mon Sep 17 00:00:00 2001
From: jaywcjlove <398188662@qq.com>
Date: Thu, 6 Oct 2022 00:30:53 +0800
Subject: [PATCH] doc: update `regex.md`.
---
docs/regex.md | 201 ++++++++++++++++++++++++++++++--------------------
1 file changed, 120 insertions(+), 81 deletions(-)
diff --git a/docs/regex.md b/docs/regex.md
index fa48f68..c676631 100644
--- a/docs/regex.md
+++ b/docs/regex.md
@@ -65,7 +65,7 @@ RegEX 备忘清单
- \$
- \\
- \?
-
+
使用 `\` 转义这些特殊字符
@@ -175,6 +175,33 @@ RegEX 备忘清单
`(?(?=...)yes\|no)` | 有条件的前瞻
`(?(?<=...)yes\|no)` | 有条件的往后看
+### 递归
+
+:-|-
+:-|-
+`(?R)` | 递归整个模式
+`(?1)` | 递归第一个子模式
+`(?+1)` | 递归第一个相对子模式
+`(?&name)` | 递归子模式`name`
+`(?P=name)` | 匹配子模式`name`
+`(?P>name)` | 递归子模式`name`
+
+### 标志/修饰符
+
+:-|-
+:-|-
+`g` | 全部
+`m` | 多行
+`i` | 不区分大小写
+`x` | 忽略空格
+`s` | 单线
+`u` | 统一码
+`X` | 扩展
+`U` | 不贪心
+`A` | 锚
+`J` | 重复的组名
+`d` | 结果包含捕获组子字符串开始和结束的索引
+
### 零宽度断言
:-|-
@@ -190,34 +217,6 @@ RegEX 备忘清单
零宽度断言 允许您在主模式之前(向后看)或之后(lookahead)匹配一个组,而不会将其包含在结果中。
-### 标志/修饰符
-
-:-|-
-:-|-
-`g` | 全球的
-`m` | 多行
-`i` | 不区分大小写
-`x` | 忽略空格
-`s` | 单线
-`u` | 统一码
-`X` | 扩展
-`U` | 不贪心
-`A` | 锚
-`J` | 重复的组名
-
-
-### 递归
-
-:-|-
-:-|-
-`(?R)` | 递归整个模式
-`(?1)` | 递归第一个子模式
-`(?+1)` | 递归第一个相对子模式
-`(?&name)` | 递归子模式`name`
-`(?P=name)` | 匹配子模式`name`
-`(?P>name)` | 递归子模式`name`
-
-
### POSIX 字符类
@@ -287,6 +286,27 @@ RegEX 备忘清单
使用 `\` 搜索这些特殊字符:
`[ \ ^ $ . | ? * + ( ) { }`
+### 速记类
+
+范例 | 说明
+:-|-
+`\w ` | “单词”字符
_(字母、数字或下划线)_
+`\d ` | 数字
+`\s ` | 空格
_(空格、制表符、vtab、换行符)_
+`\W, \D, or \S ` | 不是单词、数字或空格
+`[\D\S] ` | 表示不是数字或空格,两者都匹配
+`[^\d\s] ` | 禁止数字和空格
+
+### 出现次数
+
+范例 | 说明
+:-|-
+`colou?r` | 匹配 color 或 color
+`[BW]ill[ieamy's]*` | 匹配 Bill、Willy、William's 等。
+`[a-zA-Z]+` | 匹配 1 个或多个字母
+`\d{3}-\d{2}-\d{4}` | 匹配 SSN
+`[a-z]\w{1,7}` | 匹配 UW NetID
+
### 备择方案
范例 | 说明
@@ -309,28 +329,6 @@ RegEX 备忘清单
在 `[ ]` 中总是转义 `. \ ]` 有时是 `^ - .`
-
-### 速记类
-
-范例 | 说明
-:-|-
-`\w ` | “单词”字符
_(字母、数字或下划线)_
-`\d ` | 数字
-`\s ` | 空格
_(空格、制表符、vtab、换行符)_
-`\W, \D, or \S ` | 不是单词、数字或空格
-`[\D\S] ` | 表示不是数字或空格,两者都匹配
-`[^\d\s] ` | 禁止数字和空格
-
-### 出现次数
-
-范例 | 说明
-:-|-
-`colou?r` | 匹配 color 或 color
-`[BW]ill[ieamy's]*` | 匹配 Bill、Willy、William's 等。
-`[a-zA-Z]+` | 匹配 1 个或多个字母
-`\d{3}-\d{2}-\d{4}` | 匹配 SSN
-`[a-z]\w{1,7}` | 匹配 UW NetID
-
### 贪婪与懒惰
范例 | 说明
@@ -340,7 +338,6 @@ RegEX 备忘清单
`*? +? {n,}?`
_lazy_ | 尽可能少匹配
`<.+?>` | 在 \<b>bold\<\/b> 中找到 2 个匹配项
-
### 范围
@@ -370,7 +367,6 @@ RegEX 备忘清单
`(?-x)` | 自由空间模式关闭
/regex/`ismx` | 修改整个字符串的模式
-
### 组
范例 | 说明
@@ -394,7 +390,7 @@ RegEX 备忘清单
范例 | 说明
:-|-
-`on(?:click\|load)` | 快于:
`on(click\|load)`
+`on(?:click\|load)` | 快于:`on(click\|load)`
尽可能使用非捕获或原子组
@@ -543,8 +539,11 @@ M(?(?=.*?\bher\b)s|r)\.
如果想要匹配句子中的 `.` 则要写成 `\.` 以下这个例子 `\.?` 是选择性匹配.
### 锚点
+
-#### `^` 号
+匹配指定开头或结尾的字符串就要使用到锚点。
+
+#### `^` 号 (符串的开头)
表达式 | 匹配示例
:- | -
@@ -552,32 +551,32 @@ M(?(?=.*?\bher\b)s|r)\.
`^(T\|t)he` | `The` car is parked in the garage.
-#### `$` 号
+#### `$` 号 (否是最后一个)
表达式 | 匹配示例
:- | -
`(at\.)` | The fat c`at.` s`at.` on the m`at.`
-`(at\.)$` | The fat cat. sat. on the m`at`.
+`(at\.)$` | The fat cat. sat. on the m`at.`
### 简写字符集
-
+
|简写|描述|
|:----:|----|
|`.`|除换行符外的所有字符|
-|`\w`|匹配所有字母数字,等同于 `[a-zA-Z0-9_]`|
-|`\W`|匹配所有非字母数字,即符号,等同于: `[^\w]`|
+|`\w`|匹配所有字母数字
等同于 `[a-zA-Z0-9_]`|
+|`\W`|匹配所有非字母数字,即符号
等同于: `[^\w]`|
|`\d`|匹配数字: `[0-9]`|
|`\D`|匹配非数字: `[^\d]`|
-|`\s`|匹配所有空格字符,等同于: `[\t\n\f\r\p{Z}]`|
+|`\s`|匹配所有空格字符
等同于:`[\t\n\f\r\p{Z}]`|
|`\S`|匹配所有非空格字符: `[^\s]`|
|`\f`|匹配一个换页符|
|`\n`|匹配一个换行符|
|`\r`|匹配一个回车符|
|`\t`|匹配一个制表符|
|`\v`|匹配一个垂直制表符|
-|`\p`|匹配 CR/LF(等同于 `\r\n`),用来匹配 DOS 行终止符|
+|`\p`|匹配 CR/LF(等同于 `\r\n`)
用来匹配 DOS 行终止符|
正则表达式提供一些常用的字符集简写。
@@ -756,6 +755,38 @@ False
JavaScript 中的正则表达式
---------------
+### RegExp
+
+
+#### 属性
+
+:- | :-
+:- | :-
+`dotAll` | 是否使用了 `s` 修饰符
+`flags` | 返回标志的字符串
+`global` | 是否使用了 `g` (全部)修饰符
+`hasIndices` | 是否使用了 `d` 修饰符
+`ignoreCase` | 匹配文本的时候是否忽略大小写 `i`
+`multiline` | 是否进行多行搜索 `m`
+`lastIndex` | 该索引表示从哪里开始下一个匹配
+`source` | 正则表达式的文本
+`sticky` | 搜索是否是 sticky
+`unicode` | Unicode 功能是否开启
+
+#### 方法
+
+:- | :-
+:- | :-
+`match()` | 获取匹配结果
+`matchAll()` | 所有匹配项
+`replace()` | 替换所有符合正则模式的匹配项
+`search()` | 搜索以取得匹配正则模式的项
+`split()` | 切割字符串返回字符串数组
+~~`compile()`~~ | (重新)编译正则表达式
+`exec()` | 指定字符串中执行一个搜索匹配
+`test()` | 正则表达式与指定的字符串是否匹配
+`toString()` | 返回该正则表达式的字符串
+
### test()
```javascript
@@ -763,11 +794,8 @@ let textA = 'I like APPles very much';
let textB = 'I like APPles';
let regex = /apples$/i
-// Output: false
-console.log(regex.test(textA));
-
-// Output: true
-console.log(regex.test(textB));
+console.log(regex.test(textA)); // false
+console.log(regex.test(textB)); // true
```
### search()
@@ -776,29 +804,22 @@ console.log(regex.test(textB));
let text = 'I like APPles very much';
let regexA = /apples/;
let regexB = /apples/i;
-
-// Output: -1
-console.log(text.search(regexA));
-
-// Output: 7
-console.log(text.search(regexB));
-```
+console.log(text.search(regexA)); // -1
+console.log(text.search(regexB)); // 7
+```
### exec()
```javascript
let text = 'Do you like apples?';
let regex= /apples/;
-
// Output: apples
console.log(regex.exec(text)[0]);
-
// Output: Do you like apples?
console.log(regex.exec(text).input);
```
-
### match()
```javascript
@@ -809,7 +830,6 @@ let regex = /apples/gi;
console.log(text.match(regex));
```
-
### split()
@@ -844,15 +864,33 @@ let result = text.replace(regex, 'mangoes');
console.log(result);
```
+### 属性示例
+
+```javascript
+/d/s.dotAll; // => true
+/d/g.global; // => true
+/d/ig.flags; // => "gi"
+/d/d.hasIndices; // => true
+/d/i.ignoreCase; // => true
+```
+
+### 多行文本中使用正则表达式
+
+```js
+let s = "Please yes\nmake my day!";
+
+s.match(/yes[^]*day/);
+// 返回 'yes\nmake my day'
+```
### replaceAll()
```javascript
let regex = /apples/gi;
let text = 'Here are apples and apPleS';
-// Output: Here are mangoes and mangoes
-let result = text.replaceAll(regex, "mangoes");
-console.log(result);
+
+text.replaceAll(regex, "mangoes");
+// 返回: Here are mangoes and mangoes
```
@@ -879,6 +917,7 @@ PHP中的正则表达式
```php
$str = "Visit Microsoft!";
$regex = "/microsoft/i";
+
// Output: Visit QuickRef!
echo preg_replace($regex, "QuickRef", $str);
```