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` | 匹配 colorcolor +`[BW]ill[ieamy's]*` | 匹配 BillWillyWilliam'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` | 匹配 colorcolor -`[BW]ill[ieamy's]*` | 匹配 BillWillyWilliam'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); ```