1160 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			1160 lines
		
	
	
		
			30 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
RegEX 备忘清单
 | 
						||
===
 | 
						||
 | 
						||
正则表达式 (regex) 的快速参考,包括符号、范围、分组、断言和一些示例模式,以帮助您入门。
 | 
						||
 | 
						||
入门
 | 
						||
--------
 | 
						||
 | 
						||
### 介绍
 | 
						||
 | 
						||
这是开始使用正则表达式(Regex)的快速备忘单。
 | 
						||
 | 
						||
- [Python 中的 Regex](#python-中的正则表达式) _(Quick Reference)_
 | 
						||
- [JavaScript 中的 Regex](#javascript-中的正则表达式) _(Quick Reference)_
 | 
						||
- [PHP 中的 Regex](#php中的正则表达式) _(Quick Reference)_
 | 
						||
- [Java 中的 Regex](#java-中的正则表达式) _(Quick Reference)_
 | 
						||
- [MySQL 中的 Regex](#mysql中的正则表达式) _(Quick Reference)_
 | 
						||
- [Vim 中的 Regex](./vim#vim-搜索和替换) _(Quick Reference)_
 | 
						||
- [在线 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-->
 | 
						||
 | 
						||
### 字符类
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`[abc]`       | 单个字符:`a`、`b` 或 `c`
 | 
						||
`[^abc]`      | 一个字符,除了:`a`、`b` 或 `c`
 | 
						||
`[a-z]`       | 范围内的字符:`a-z`
 | 
						||
`[^a-z]`      | 不在范围内的字符:`a-z`
 | 
						||
`[0-9]`       | 范围内的数字:`0-9`
 | 
						||
`[a-zA-Z]`    | 范围内的字符:<br>`a-z` 或 `A-Z`
 | 
						||
`[a-zA-Z0-9]` | 范围内的字符:<br>`a-z`、`A-Z` 或 `0-9`
 | 
						||
 | 
						||
### 量词
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`a?`      | 零个或一个`a`
 | 
						||
`a*`      | 零个或多个 `a`
 | 
						||
`a+`      | 一个或多个`a`
 | 
						||
`[0-9]+`  | `0-9`中的一个或多个
 | 
						||
`a{3}`    | 正好 `3` 个 `a`
 | 
						||
`a{3,}`   | 3个或更多的`a`
 | 
						||
`a{3,6}`  | `a` 的 `3` 到 `6` 之间
 | 
						||
`a*`      | 贪心量词
 | 
						||
`a*?`     | 惰性量词
 | 
						||
`a*+`     | 占有量词
 | 
						||
 | 
						||
### 常用元字符
 | 
						||
 | 
						||
- \^
 | 
						||
- \{
 | 
						||
- \+
 | 
						||
- \<
 | 
						||
- \[
 | 
						||
- \*
 | 
						||
- \)
 | 
						||
- \>
 | 
						||
- \.
 | 
						||
- \(
 | 
						||
- \|
 | 
						||
- \$
 | 
						||
- \\
 | 
						||
- \?
 | 
						||
<!--rehype:className=cols-3 style-none-->
 | 
						||
 | 
						||
使用 `\` 转义这些特殊字符
 | 
						||
 | 
						||
### 元序列
 | 
						||
<!--rehype:wrap-class=row-span-4-->
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`.`          | 任何单个字符
 | 
						||
`\s`         | 任何空白字符
 | 
						||
`\S`         | 任何非空白字符
 | 
						||
`\d`         | 任何数字,与 `[0-9]` 相同
 | 
						||
`\D`         | 任何非数字,与 `[^0-9]` 相同
 | 
						||
`\w`         | 任何单词字符
 | 
						||
`\W`         | 任何非单词字符
 | 
						||
`\X`         | 任何 Unicode 序列,包括换行符
 | 
						||
`\C`         | 匹配一个数据单元
 | 
						||
`\R`         | Unicode 换行符
 | 
						||
`\v`         | 垂直空白字符
 | 
						||
`\V`         | `\v` 的否定 - 除了换行符和垂直制表符之外的任何内容
 | 
						||
`\h`         | 水平空白字符
 | 
						||
`\H`         | `\h` 的否定
 | 
						||
`\K`         | 重置匹配
 | 
						||
`\n`         | 匹配第 `n` 个子模式
 | 
						||
`\pX`        | `Unicode` 属性 `X`
 | 
						||
`\p{...}`    | `Unicode` 属性或脚本类别
 | 
						||
`\PX`        | `\pX` 的否定
 | 
						||
`\P{...}`    | `\p` 的否定
 | 
						||
`\Q...\E`    | 引用;视为文字
 | 
						||
`\k<name>`   | 匹配子模式`name`
 | 
						||
`\k'name'`   | 匹配子模式`name`
 | 
						||
`\k{name}`   | 匹配子模式`name`
 | 
						||
`\gn`        | 匹配第 n 个子模式
 | 
						||
`\g{n}`      | 匹配第 n 个子模式
 | 
						||
`\g<n>`      | 递归第 n 个捕获组
 | 
						||
`\g'n'`      | 递归第 n 个捕获组。
 | 
						||
`\g{-n}`     | 匹配第 n 个相对前一个子模式
 | 
						||
`\g<+n>`     | 递归第 n 个相对即将到来的子模式
 | 
						||
`\g'+n'`     | 匹配第 n 个相对即将到来的子模式
 | 
						||
`\g'letter'` | 递归命名捕获组 `字母`
 | 
						||
`\g{letter}` | 匹配先前命名的捕获组 `字母`
 | 
						||
`\g<letter>` | 递归命名捕获组 `字母`
 | 
						||
`\xYY`       | 十六进制字符 `YY`
 | 
						||
`\x{YYYY}`   | 十六进制字符 `YYYY`
 | 
						||
`\ddd`       | 八进制字符`ddd`
 | 
						||
`\cY`        | 控制字符 `Y`
 | 
						||
`[\b]`       | 退格字符
 | 
						||
`\`          | 使任何字符文字
 | 
						||
 | 
						||
### 锚点
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`\G`    | 比赛开始
 | 
						||
`^`     | 字符串的开始
 | 
						||
`$`     | 字符串结束
 | 
						||
`\A`    | 字符串的开始
 | 
						||
`\Z`    | 字符串结束
 | 
						||
`\z`    | 字符串的绝对结尾
 | 
						||
`\b`    | 一个词的边界
 | 
						||
`\B`    | 非单词边界
 | 
						||
 | 
						||
### 替代
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`\0`       | 完整的比赛内容
 | 
						||
`\1`       | 捕获组 `1` 中的内容
 | 
						||
`$1`       | 捕获组 `1` 中的内容
 | 
						||
`${foo}`   | 捕获组 `foo` 中的内容
 | 
						||
`\x20`     | 十六进制替换值
 | 
						||
`\x{06fa}` | 十六进制替换值
 | 
						||
`\t`       | 标签
 | 
						||
`\r`       | 回车
 | 
						||
`\n`       | 新队
 | 
						||
`\f`       | 换页
 | 
						||
`\U`       | 大写转换
 | 
						||
`\L`       | 小写转换
 | 
						||
`\E`       | 终止任何转换
 | 
						||
 | 
						||
### 组构造
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`(...)`           | 捕获所有封闭的东西
 | 
						||
`(a\|b)`          | 匹配 `a` 或 `b`
 | 
						||
`(?:...)`         | 匹配随附的所有内容
 | 
						||
`(?>...)`         | 原子组(非捕获)
 | 
						||
`(?\|...)`        | 重复的子模式组号
 | 
						||
`(?#...)`         | 注解
 | 
						||
`(?'name'...)`    | 命名捕获组
 | 
						||
`(?<name>...)`    | 命名捕获组
 | 
						||
`(?P<name>...)`   | 命名捕获组
 | 
						||
`(?imsxXU)`       | 内联修饰符
 | 
						||
`(?(DEFINE)...)`  | 在使用它们之前预定义模式
 | 
						||
 | 
						||
### 断言
 | 
						||
 | 
						||
:-|-
 | 
						||
:-|-
 | 
						||
`(?(1)yes\|no)`      | 条件语句
 | 
						||
`(?(R)yes\|no)`      | 条件语句
 | 
						||
`(?(R#)yes\|no)`     | 递归条件语句
 | 
						||
`(?(R&name)yes\|no)` | 条件语句
 | 
						||
`(?(?=...)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`   | 结果包含捕获组子字符串开始和结束的索引
 | 
						||
 | 
						||
### 零宽度断言
 | 
						||
 | 
						||
:-|-
 | 
						||
:-|-
 | 
						||
`(?=...)`  | 正先行断言
 | 
						||
`(?!...)`  | 负先行断言
 | 
						||
`(?<=...)` | 正后发断言
 | 
						||
`(?<!...)` | 负后发断言
 | 
						||
`?=`|正先行断言-存在
 | 
						||
`?!`|负先行断言-排除
 | 
						||
`?<=`|正后发断言-存在
 | 
						||
`?<!`|负后发断言-排除
 | 
						||
 | 
						||
零宽度断言 允许您在主模式之前(向后看)或之后(lookahead)匹配一个组,而不会将其包含在结果中。
 | 
						||
 | 
						||
### POSIX 字符类
 | 
						||
<!--rehype:wrap-class=col-span-2-->
 | 
						||
 | 
						||
字符类 | 如同 | 意义
 | 
						||
:-|-|-
 | 
						||
| `[[:alnum:]]`   | `[0-9A-Za-z]`                                     | 字母和数字
 | 
						||
| `[[:alpha:]]`   | `[A-Za-z]`                                        | 字母
 | 
						||
| `[[:ascii:]]`   | `[\x00-\x7F]`                                     | ASCII 码 0-127
 | 
						||
| `[[:blank:]]`   | `[\t ]`                                           | 仅空格或制表符
 | 
						||
| `[[:cntrl:]]`   | `[\x00-\x1F\x7F]`                                 | 控制字符
 | 
						||
| `[[:digit:]]`   | `[0-9]`                                           | 十进制数字
 | 
						||
| `[[:graph:]]`   | `[[:alnum:][:punct:]]`                            | 可见字符(不是空格)
 | 
						||
| `[[:lower:]]`   | `[a-z]`                                           | 小写字母
 | 
						||
| `[[:print:]]`   | `[ -~] == [ [:graph:]]`                           | 可见字符
 | 
						||
| `[[:punct:]]`   | <code>[!"#$%&’()*+,-./:;<=>?@[]^_\`{\|}~]</code>  | 可见标点符号
 | 
						||
| `[[:space:]]`   | <code>[\t\n\v\f\r ]</code>                        | 空白
 | 
						||
| `[[:upper:]]`   | `[A-Z]`                                           | 大写字母
 | 
						||
| `[[:word:]]`    | `[0-9A-Za-z_]`                                    | 单词字符
 | 
						||
| `[[:xdigit:]]`  | `[0-9A-Fa-f]`                                     | 十六进制数字
 | 
						||
| `[[:<:]]`       | `[\b(?=\w)]`                                      | 词的开头
 | 
						||
| `[[:>:]]`       | `[\b(?<=\w)]`                                     | 词尾
 | 
						||
<!--rehype:className=show-header-->
 | 
						||
 | 
						||
### 控制动词
 | 
						||
 | 
						||
:-|-
 | 
						||
:-|-
 | 
						||
`(*ACCEPT)`            | 控制动词
 | 
						||
`(*FAIL)`              | 控制动词
 | 
						||
`(*MARK:NAME)`         | 控制动词
 | 
						||
`(*COMMIT)`            | 控制动词
 | 
						||
`(*PRUNE)`             | 控制动词
 | 
						||
`(*SKIP)`              | 控制动词
 | 
						||
`(*THEN)`              | 控制动词
 | 
						||
`(*UTF)`               | 图案修饰符
 | 
						||
`(*UTF8)`              | 图案修饰符
 | 
						||
`(*UTF16)`             | 图案修饰符
 | 
						||
`(*UTF32)`             | 图案修饰符
 | 
						||
`(*UCP)`               | 图案修饰符
 | 
						||
`(*CR)`                | 换行修饰符
 | 
						||
`(*LF)`                | 换行修饰符
 | 
						||
`(*CRLF)`              | 换行修饰符
 | 
						||
`(*ANYCRLF)`           | 换行修饰符
 | 
						||
`(*ANY)`               | 换行修饰符
 | 
						||
`\R`                   | 换行修饰符
 | 
						||
`(*BSR_ANYCRLF)`       | 换行修饰符
 | 
						||
`(*BSR_UNICODE)`       | 换行修饰符
 | 
						||
`(*LIMIT_MATCH=x)`     | 正则表达式引擎修饰符
 | 
						||
`(*LIMIT_RECURSION=d)` | 正则表达式引擎修饰符
 | 
						||
`(*NO_AUTO_POSSESS)`   | 正则表达式引擎修饰符
 | 
						||
`(*NO_START_OPT)`      | 正则表达式引擎修饰符
 | 
						||
 | 
						||
正则表达式示例
 | 
						||
--------------
 | 
						||
 | 
						||
### 字符串
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`ring` | 匹配 <yel>ring</yel> sp<yel>ring</yel>board 等。
 | 
						||
`.` | 匹配 <yel>a</yel>、<yel>9</yel>、<yel>+</yel> 等。
 | 
						||
`h.o` | 匹配 <yel>hoo</yel>、<yel>h2o</yel>、<yel>h/o</yel> 等。
 | 
						||
`ring\?` | 匹配 <yel>ring?</yel>
 | 
						||
`\(quiet\)` | 匹配<yel>(安静)</yel>
 | 
						||
`c:\\windows` | 匹配 <yel>c:\windows</yel>
 | 
						||
 | 
						||
使用 `\` 搜索这些特殊字符:<br> `[ \ ^ $ . | ? * + ( ) { }`
 | 
						||
 | 
						||
### 速记类
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`\w` | “单词”字符 <br> _(字母、数字或下划线)_
 | 
						||
`\d` | 数字
 | 
						||
`\s` | 空格 <br> _(空格、制表符、vtab、换行符)_
 | 
						||
`\W, \D, or \S` | 不是单词、数字或空格
 | 
						||
`[\D\S]` | 表示不是数字或空格,两者都匹配
 | 
						||
`[^\d\s]` | 禁止数字和空格
 | 
						||
 | 
						||
### 出现次数
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`colou?r`           | 匹配 <yel>color</yel> 或 <yel>color</yel>
 | 
						||
`[BW]ill[ieamy's]*` | 匹配 <yel>Bill</yel>、<yel>Willy</yel>、<yel>William's</yel> 等。
 | 
						||
`[a-zA-Z]+`         | 匹配 1 个或多个字母
 | 
						||
`\d{3}-\d{2}-\d{4}` | 匹配 SSN
 | 
						||
`[a-z]\w{1,7}`      | 匹配 UW NetID
 | 
						||
 | 
						||
### 备择方案
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`cat\|dog` | 匹配 <yel>cat</yel> 或 <yel>dog</yel>
 | 
						||
`id\|identity` | 匹配 <yel>id</yel> 或 <yel>id</yel>entity
 | 
						||
`identity\|id` | 匹配 <yel>id</yel> 或 <yel>identity</yel>
 | 
						||
 | 
						||
当替代品重叠时,命令从长到短
 | 
						||
 | 
						||
### 字符类
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`[aeiou]`     | 匹配任何元音
 | 
						||
`[^aeiou]`    | 匹配一个非元音
 | 
						||
`r[iau]ng`    | 匹配<yel>ring</yel>、w<yel>rang</yel>le、sp<yel>rung</yel>等。
 | 
						||
`gr[ae]y`     | 匹配 <yel>gray</yel> 或 <yel>grey</yel>
 | 
						||
`[a-zA-Z0-9]` | 匹配任何字母或数字
 | 
						||
 | 
						||
在 `[ ]` 中总是转义 `. \ ]` 有时是 `^ - .`
 | 
						||
 | 
						||
### 贪婪与懒惰
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`*  + {n,}`<br>_greedy_  | 尽可能匹配
 | 
						||
`<.+>`                | 在 <yel>\<b>bold\<\/b></yel> 中找到 1 个大匹配项
 | 
						||
`*?  +? {n,}?`<br>_lazy_ | 尽可能少匹配
 | 
						||
`<.+?>`                  | 在 \<<yel>b</yel>>bold\<<yel>\/b</yel>> 中找到 2 个匹配项
 | 
						||
 | 
						||
### 范围
 | 
						||
<!--rehype:wrap-class=col-span-2-->
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`\b` | “单词”边缘(非“单词”字符旁边)
 | 
						||
`\bring` | 单词以“ring”开头,例如 <yel>ringtone</yel>
 | 
						||
`ring\b` | 单词以“ring”结尾,例如 <yel>spring</yel>
 | 
						||
`\b9\b` | 匹配单个数字 <yel>9</yel>,而不是 19、91、99 等。
 | 
						||
`\b[a-zA-Z]{6}\b` | 匹配 6 个字母的单词
 | 
						||
`\B` | 不是字边
 | 
						||
`\Bring\B` | 匹配 <yel>springs</yel> 和 <yel>wringer</yel>
 | 
						||
`^\d*$` | 整个字符串必须是数字
 | 
						||
`^[a-zA-Z]{4,20}$` | 字符串必须有 4-20 个字母
 | 
						||
`^[A-Z]` | 字符串必须以大写字母开头
 | 
						||
`[\.!?"')]$` | 字符串必须以终端标点结尾
 | 
						||
 | 
						||
### 修饰
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`(?i)`[a-z]*`(?-i)` | 忽略大小写开/关
 | 
						||
`(?s)`.*`(?-s)`     | 匹配多行(导致 . 匹配换行符)
 | 
						||
`(?m)`^.*;$`(?-m)`  | <yel>^</yel> & <yel>$</yel> 匹配行不是整个字符串
 | 
						||
`(?x)`              | #free-spacing 模式,此 EOL 注释被忽略
 | 
						||
`(?-x)`             | 自由空间模式关闭
 | 
						||
/regex/`ismx`       | 修改整个字符串的模式
 | 
						||
 | 
						||
### 组
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`(in\|out)put` | 匹配 <yel>input</yel> 或 <yel>output</yel>
 | 
						||
`\d{5}(-\d{4})?` | 美国邮政编码 _(“+ 4”可选)_
 | 
						||
 | 
						||
如果组后匹配失败,解析器会尝试每个替代方案。
 | 
						||
<br>
 | 
						||
可能导致灾难性的回溯。
 | 
						||
 | 
						||
### 反向引用
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`(to) (be) or not \1 \2` | 匹配 <yel>to be or not to be</yel>
 | 
						||
`([^\s])\1{2}`           | 匹配非空格,然后再相同两次   <yel>aaa</yel>, <yel>...</yel>
 | 
						||
`\b(\w+)\s+\1\b`         | 匹配双字
 | 
						||
 | 
						||
### 非捕获组
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`on(?:click\|load)` | 快于:`on(click\|load)`
 | 
						||
 | 
						||
尽可能使用非捕获或原子组
 | 
						||
 | 
						||
### 原子组
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`(?>red\|green\|blue)` | 比非捕获更快
 | 
						||
`(?>id\|identity)\b`   | 匹配 <yel>id</yel>,但不匹配 <yel>id</yel>entity
 | 
						||
 | 
						||
"id" 匹配,但 `\b` 在原子组之后失败,
 | 
						||
解析器不会回溯到组以重试“身份”
 | 
						||
 | 
						||
如果替代品重叠,请从长到短命令。
 | 
						||
 | 
						||
### 零宽度断言 Lookaround(前后预查)
 | 
						||
<!--rehype:wrap-class=col-span-2 row-span-2-->
 | 
						||
 | 
						||
范例 | 说明
 | 
						||
:-|-
 | 
						||
`(?= )`                 | 向前看,如果你能提前找到
 | 
						||
`(?! )`                 | 向前看,如果你找不到前面
 | 
						||
`(?<= )`                | 向后看,如果你能找到后面
 | 
						||
`(?<! )`                | 向后看,如果你找不到后面
 | 
						||
`\b\w+?(?=ing\b)`       | 匹配 <yel>warbl</yel>ing, <yel>str</yel>ing, <yel>fish</yel>ing, ...
 | 
						||
`\b(?!\w+ing\b)\w+\b`   | 不以“ing”结尾的单词
 | 
						||
`(?<=\bpre).*?\b`      | 匹配 pre<yel>tend</yel>、pre<yel>sent</yel>、pre<yel>fix</yel>、...
 | 
						||
`\b\w{3}(?<!pre)\w*?\b` | 不以“pre”开头的词
 | 
						||
`\b\w+(?<!ing)\b`       | 匹配不以“ing”结尾的单词
 | 
						||
 | 
						||
### If-then-else
 | 
						||
 | 
						||
匹配 `Mr.` 或 `Ms.` 如果单词 `her` 稍后在字符串中
 | 
						||
 | 
						||
```
 | 
						||
M(?(?=.*?\bher\b)s|r)\.
 | 
						||
```
 | 
						||
 | 
						||
需要环顾 `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` <pur>`par`</pur>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` <pur>`car`</pur> `parked` <pur>`in`</pur> `the` <pur>`garage`</pur> #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=style-list-arrow-->
 | 
						||
 | 
						||
### `(...)` 特征标群
 | 
						||
 | 
						||
表达式 | 匹配示例
 | 
						||
:- | -
 | 
						||
`(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-->
 | 
						||
 | 
						||
如果想要匹配句子中的 `.` 则要写成 `\.` 以下这个例子 `\.?` 是选择性匹配.
 | 
						||
 | 
						||
### 锚点
 | 
						||
<!--rehype:wrap-class=row-span-2-->
 | 
						||
 | 
						||
匹配指定开头或结尾的字符串就要使用到锚点。
 | 
						||
 | 
						||
#### `^` 号 (符串的开头)
 | 
						||
 | 
						||
表达式 | 匹配示例
 | 
						||
:- | -
 | 
						||
`(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-4-->
 | 
						||
 | 
						||
|简写|描述|
 | 
						||
|:----:|----|
 | 
						||
|`.`|除换行符外的所有字符|
 | 
						||
|`\w`|匹配所有字母数字<br />等同于 `[a-zA-Z0-9_]`|
 | 
						||
|`\W`|匹配所有非字母数字,即符号<br />等同于: `[^\w]`|
 | 
						||
|`\d`|匹配数字: `[0-9]`|
 | 
						||
|`\D`|匹配非数字: `[^\d]`|
 | 
						||
|`\s`|匹配所有空格字符<br />等同于:`[\t\n\f\r\p{Z}]`|
 | 
						||
|`\S`|匹配所有非空格字符: `[^\s]`|
 | 
						||
|`\f`|匹配一个换页符|
 | 
						||
|`\n`|匹配一个换行符|
 | 
						||
|`\r`|匹配一个回车符|
 | 
						||
|`\t`|匹配一个制表符|
 | 
						||
|`\v`|匹配一个垂直制表符|
 | 
						||
|`\p`|匹配 CR/LF(等同于 `\r\n`)<br />用来匹配 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
 | 
						||
import re
 | 
						||
```
 | 
						||
 | 
						||
### 实例
 | 
						||
<!--rehype:wrap-class=col-span-2 row-span-3-->
 | 
						||
 | 
						||
#### re.search()
 | 
						||
 | 
						||
```python
 | 
						||
>>> sentence = 'This is a sample string'
 | 
						||
>>> bool(re.search(r'this', sentence, flags=re.I))
 | 
						||
True
 | 
						||
>>> bool(re.search(r'xyz', sentence))
 | 
						||
False
 | 
						||
```
 | 
						||
 | 
						||
#### re.findall()
 | 
						||
 | 
						||
```python
 | 
						||
>>> re.findall(r'\bs?pare?\b', 'par spar apparent spare part pare')
 | 
						||
['par', 'spar', 'spare', 'pare']
 | 
						||
>>> re.findall(r'\b0*[1-9]\d{2,}\b', '0501 035 154 12 26 98234')
 | 
						||
['0501', '154', '98234']
 | 
						||
```
 | 
						||
 | 
						||
#### re.finditer()
 | 
						||
 | 
						||
```python
 | 
						||
>>> m_iter = re.finditer(r'[0-9]+', '45 349 651 593 4 204')
 | 
						||
>>> [m[0] for m in m_iter if int(m[0]) < 350]
 | 
						||
['45', '349', '4', '204']
 | 
						||
```
 | 
						||
 | 
						||
#### re.split()
 | 
						||
 | 
						||
```python
 | 
						||
>>> re.split(r'\d+', 'Sample123string42with777numbers')
 | 
						||
['Sample', 'string', 'with', 'numbers']
 | 
						||
```
 | 
						||
 | 
						||
#### re.sub()
 | 
						||
 | 
						||
```python
 | 
						||
>>> ip_lines = "catapults\nconcatenate\ncat"
 | 
						||
>>> print(re.sub(r'^', r'* ', ip_lines, flags=re.M))
 | 
						||
* catapults
 | 
						||
* concatenate
 | 
						||
* cat
 | 
						||
```
 | 
						||
 | 
						||
#### re.compile()
 | 
						||
 | 
						||
```python
 | 
						||
>>> pet = re.compile(r'dog')
 | 
						||
>>> type(pet)
 | 
						||
<class '_sre.SRE_Pattern'>
 | 
						||
>>> bool(pet.search('They bought a dog'))
 | 
						||
True
 | 
						||
>>> bool(pet.search('A cat crossed their path'))
 | 
						||
False
 | 
						||
```
 | 
						||
 | 
						||
### 函数
 | 
						||
 | 
						||
函数 | 说明
 | 
						||
:-|-
 | 
						||
`re.findall`  | 返回包含所有匹配项的列表
 | 
						||
`re.finditer` | 返回一个可迭代的匹配对象<br/> _(每个匹配一个)_
 | 
						||
`re.search`   | 如果字符串中的任何位置存在匹配项,则返回 Match 对象
 | 
						||
`re.split`    | 返回一个列表,其中字符串在每次匹配时被拆分
 | 
						||
`re.sub`      | 用字符串替换一个或多个匹配项
 | 
						||
`re.compile`  | 编译正则表达式模式供以后使用
 | 
						||
`re.escape`   | 返回所有非字母数字反斜杠的字符串
 | 
						||
 | 
						||
### Flags 标志
 | 
						||
 | 
						||
:- | - | -
 | 
						||
:- | - | -
 | 
						||
`re.I` | `re.IGNORECASE` | 忽略大小写
 | 
						||
`re.M` | `re.MULTILINE`  | 多行
 | 
						||
`re.L` | `re.LOCALE`     | 使 `\w`、`\b`、`\s` _locale 依赖_
 | 
						||
`re.S` | `re.DOTALL`     | 点匹配所有 _(包括换行符)_
 | 
						||
`re.U` | `re.UNICODE`    | 使 `\w`、`\b`、`\d`、`\s` _unicode 依赖_
 | 
						||
`re.X` | `re.VERBOSE`    | 可读风格
 | 
						||
 | 
						||
JavaScript 中的正则表达式
 | 
						||
---------------
 | 
						||
 | 
						||
### RegExp
 | 
						||
<!--rehype:wrap-class=row-span-4-->
 | 
						||
 | 
						||
#### 属性
 | 
						||
 | 
						||
:- | :-
 | 
						||
:- | :-
 | 
						||
`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
 | 
						||
let textA = 'I like APPles very much';
 | 
						||
let textB = 'I like APPles';
 | 
						||
let regex = /apples$/i
 | 
						||
 
 | 
						||
console.log(regex.test(textA)); // false
 | 
						||
console.log(regex.test(textB)); // true
 | 
						||
```
 | 
						||
 | 
						||
### search()
 | 
						||
 | 
						||
```javascript
 | 
						||
let text = 'I like APPles very much';
 | 
						||
let regexA = /apples/;
 | 
						||
let regexB = /apples/i;
 | 
						||
 | 
						||
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
 | 
						||
let text = 'Here are apples and apPleS';
 | 
						||
let regex = /apples/gi;
 | 
						||
 
 | 
						||
// Output: [ "apples", "apPleS" ]
 | 
						||
console.log(text.match(regex));
 | 
						||
```
 | 
						||
 | 
						||
### split()
 | 
						||
<!--rehype:wrap-class=col-span-2-->
 | 
						||
 | 
						||
```javascript
 | 
						||
let text = 'This 593 string will be brok294en at places where d1gits are.';
 | 
						||
let regex = /\d+/g
 | 
						||
 
 | 
						||
// Output: [ "This ", " string will be brok", "en at places where d", "gits are." ] 
 | 
						||
console.log(text.split(regex))
 | 
						||
```
 | 
						||
 | 
						||
### matchAll()
 | 
						||
 | 
						||
```javascript
 | 
						||
let regex = /t(e)(st(\d?))/g;
 | 
						||
let text = 'test1test2';
 | 
						||
let array = [...text.matchAll(regex)];
 | 
						||
// Output: ["test1", "e", "st1", "1"]
 | 
						||
console.log(array[0]);
 | 
						||
// Output: ["test2", "e", "st2", "2"]
 | 
						||
console.log(array[1]);
 | 
						||
```
 | 
						||
 | 
						||
### replace()
 | 
						||
 | 
						||
```javascript
 | 
						||
let text = 'Do you like aPPles?';
 | 
						||
let regex = /apples/i
 | 
						||
 
 | 
						||
// Output: Do you like mangoes?
 | 
						||
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';
 | 
						||
 | 
						||
text.replaceAll(regex, "mangoes");
 | 
						||
// 返回: Here are mangoes and mangoes
 | 
						||
```
 | 
						||
<!--rehype:className=wrap-text-->
 | 
						||
 | 
						||
PHP中的正则表达式
 | 
						||
------------
 | 
						||
 | 
						||
### 函数
 | 
						||
<!--rehype:wrap-class=col-span-2-->
 | 
						||
 | 
						||
:- | -
 | 
						||
:- | -
 | 
						||
`preg_match()`            | 执行正则表达式匹配
 | 
						||
`preg_match_all()`        | 执行全局正则表达式匹配
 | 
						||
`preg_replace_callback()` | 使用回调执行正则表达式搜索和替换
 | 
						||
`preg_replace()`          | 执行正则表达式搜索和替换
 | 
						||
`preg_split()`            | 按正则表达式模式拆分字符串
 | 
						||
`preg_grep()`             | 返回与模式匹配的数组条目
 | 
						||
 | 
						||
### preg_replace
 | 
						||
 | 
						||
```php
 | 
						||
$str = "Visit Microsoft!";
 | 
						||
$regex = "/microsoft/i";
 | 
						||
 | 
						||
// Output: Visit QuickRef!
 | 
						||
echo preg_replace($regex, "QuickRef", $str); 
 | 
						||
```
 | 
						||
<!--rehype:className=wrap-text-->
 | 
						||
 | 
						||
### preg_match
 | 
						||
 | 
						||
```php
 | 
						||
$str = "Visit QuickRef";
 | 
						||
$regex = "#quickref#i";
 | 
						||
// Output: 1
 | 
						||
echo preg_match($regex, $str);
 | 
						||
```
 | 
						||
 | 
						||
### preg_matchall
 | 
						||
<!--rehype:wrap-class=col-span-2 row-span-2-->
 | 
						||
 | 
						||
```php
 | 
						||
$regex = "/[a-zA-Z]+ (\d+)/";
 | 
						||
$input_str = "June 24, August 13, and December 30";
 | 
						||
if (preg_match_all($regex, $input_str, $matches_out)) {
 | 
						||
    // Output: 2
 | 
						||
    echo count($matches_out);
 | 
						||
    // Output: 3
 | 
						||
    echo count($matches_out[0]);
 | 
						||
    // Output: Array("June 24", "August 13", "December 30")
 | 
						||
    print_r($matches_out[0]);
 | 
						||
    // Output: Array("24", "13", "30")
 | 
						||
    print_r($matches_out[1]);
 | 
						||
}
 | 
						||
```
 | 
						||
 | 
						||
### preg_grep
 | 
						||
 | 
						||
```php
 | 
						||
$arr = ["Jane", "jane", "Joan", "JANE"];
 | 
						||
$regex = "/Jane/";
 | 
						||
// Output: Jane
 | 
						||
echo preg_grep($regex, $arr);
 | 
						||
```
 | 
						||
 | 
						||
### preg_split
 | 
						||
<!--rehype:wrap-class=col-span-2-->
 | 
						||
 | 
						||
```php
 | 
						||
$str = "Jane\tKate\nLucy Marion";
 | 
						||
$regex = "@\s@";
 | 
						||
// Output: Array("Jane", "Kate", "Lucy", "Marion")
 | 
						||
print_r(preg_split($regex, $str));
 | 
						||
```
 | 
						||
 | 
						||
Java 中的正则表达式
 | 
						||
-------------
 | 
						||
 | 
						||
### 风格
 | 
						||
<!--rehype:wrap-class=col-span-2-->
 | 
						||
 | 
						||
#### 第一种方式
 | 
						||
 | 
						||
```java
 | 
						||
Pattern p = Pattern.compile(".s", Pattern.CASE_INSENSITIVE);
 | 
						||
Matcher m = p.matcher("aS");  
 | 
						||
boolean s1 = m.matches();  
 | 
						||
System.out.println(s1);   // Outputs: true
 | 
						||
```
 | 
						||
 | 
						||
#### 第二种方式
 | 
						||
 | 
						||
```java
 | 
						||
boolean s2 = Pattern.compile("[0-9]+").matcher("123").matches();  
 | 
						||
System.out.println(s2);   // Outputs: true
 | 
						||
```
 | 
						||
 | 
						||
#### 第三种方式
 | 
						||
 | 
						||
```java
 | 
						||
boolean s3 = Pattern.matches(".s", "XXXX");  
 | 
						||
System.out.println(s3);   // Outputs: false
 | 
						||
```
 | 
						||
 | 
						||
### 模式字段
 | 
						||
 | 
						||
:- | -
 | 
						||
:- | -
 | 
						||
`CANON_EQ`         | 规范等价
 | 
						||
`CASE_INSENSITIVE` | 不区分大小写的匹配
 | 
						||
`COMMENTS`         | 允许空格和注释
 | 
						||
`DOTALL`           | 圆点模式
 | 
						||
`MULTILINE`        | 多行模式
 | 
						||
`UNICODE_CASE`     | Unicode 感知大小写折叠
 | 
						||
`UNIX_LINES`       | Unix 行模式
 | 
						||
 | 
						||
### 方法
 | 
						||
 | 
						||
#### Pattern
 | 
						||
 | 
						||
- 模式编译 compile(字符串正则表达式 [,int flags])
 | 
						||
- 布尔匹配 matches([字符串正则表达式,] CharSequence 输入)
 | 
						||
- String[] 拆分 split(字符串正则表达式 [,int 限制])
 | 
						||
- 字符串引用 quote(字符串 s)
 | 
						||
 | 
						||
#### 匹配器
 | 
						||
 | 
						||
- int start([int group | 字符串名称])
 | 
						||
- int end([int group | 字符串名称])
 | 
						||
- 布尔 find([int start])
 | 
						||
- 字符 group([int 组 | 字符串名称])
 | 
						||
- 匹配器重置 reset()
 | 
						||
 | 
						||
#### String
 | 
						||
 | 
						||
- boolean matches(String regex)
 | 
						||
- String replaceAll(String regex, 字符串替换)
 | 
						||
- String[] split(String regex[, int limit])
 | 
						||
 | 
						||
还有更多方法...
 | 
						||
 | 
						||
### 例子
 | 
						||
<!--rehype:wrap-class=col-span-2-->
 | 
						||
 | 
						||
替换句子:
 | 
						||
 | 
						||
```java
 | 
						||
String regex = "[A-Z\n]{5}$";
 | 
						||
String str = "I like APP\nLE";
 | 
						||
Pattern p = Pattern.compile(regex, Pattern.MULTILINE);
 | 
						||
Matcher m = p.matcher(str);
 | 
						||
// Outputs: I like Apple!
 | 
						||
System.out.println(m.replaceAll("pple!"));
 | 
						||
```
 | 
						||
 | 
						||
所有匹配的数组:
 | 
						||
 | 
						||
```java
 | 
						||
String str = "She sells seashells by the Seashore";
 | 
						||
String regex = "\\w*se\\w*";
 | 
						||
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
 | 
						||
Matcher m = p.matcher(str);
 | 
						||
List<String> matches = new ArrayList<>();
 | 
						||
while (m.find()) {
 | 
						||
    matches.add(m.group());
 | 
						||
}
 | 
						||
// Outputs: [sells, seashells, Seashore]
 | 
						||
System.out.println(matches);
 | 
						||
```
 | 
						||
 | 
						||
MySQL中的正则表达式
 | 
						||
-------------
 | 
						||
<!--rehype:body-class=cols-2-->
 | 
						||
 | 
						||
### 函数
 | 
						||
 | 
						||
函数名称 | 说明
 | 
						||
:- | -
 | 
						||
`REGEXP` | 字符串是否匹配正则表达式
 | 
						||
`REGEXP_INSTR()` | 匹配正则表达式的子字符串的起始索引 <br>_(注意:仅限 MySQL 8.0+)_
 | 
						||
`REGEXP_LIKE()` | 字符串是否匹配正则表达式 <br>_(注意:仅 MySQL 8.0+)_
 | 
						||
`REGEXP_REPLACE()` | 替换匹配正则表达式的子字符串 <br>_(注意:仅限 MySQL 8.0+)_
 | 
						||
`REGEXP_SUBSTR()` | 返回匹配正则表达式的子字符串 <br>_(注意:仅 MySQL 8.0+)_
 | 
						||
 | 
						||
### REGEXP
 | 
						||
 | 
						||
```sql
 | 
						||
expr REGEXP pat 
 | 
						||
```
 | 
						||
 | 
						||
#### Examples
 | 
						||
 | 
						||
```sql
 | 
						||
mysql> SELECT 'abc' REGEXP '^[a-d]';
 | 
						||
1
 | 
						||
mysql> SELECT name FROM cities WHERE name REGEXP '^A';
 | 
						||
mysql> SELECT name FROM cities WHERE name NOT REGEXP '^A';
 | 
						||
mysql> SELECT name FROM cities WHERE name REGEXP 'A|B|R';
 | 
						||
mysql> SELECT 'a' REGEXP 'A', 'a' REGEXP BINARY 'A';
 | 
						||
1   0
 | 
						||
```
 | 
						||
 | 
						||
### REGEXP_REPLACE
 | 
						||
 | 
						||
```
 | 
						||
REGEXP_REPLACE(expr, pat, repl[, pos[, occurrence[, match_type]]])
 | 
						||
```
 | 
						||
 | 
						||
#### 例子
 | 
						||
 | 
						||
```sql
 | 
						||
mysql> SELECT REGEXP_REPLACE('a b c', 'b', 'X');
 | 
						||
a X c
 | 
						||
mysql> SELECT REGEXP_REPLACE('abc ghi', '[a-z]+', 'X', 1, 2);
 | 
						||
abc X
 | 
						||
```
 | 
						||
 | 
						||
### REGEXP_SUBSTR
 | 
						||
 | 
						||
```
 | 
						||
REGEXP_SUBSTR(expr, pat[, pos[, occurrence[, match_type]]])
 | 
						||
```
 | 
						||
 | 
						||
#### 例子
 | 
						||
 | 
						||
```sql
 | 
						||
mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+');
 | 
						||
abc
 | 
						||
mysql> SELECT REGEXP_SUBSTR('abc def ghi', '[a-z]+', 1, 3);
 | 
						||
ghi
 | 
						||
```
 | 
						||
 | 
						||
### REGEXP_LIKE
 | 
						||
 | 
						||
```
 | 
						||
REGEXP_LIKE(expr, pat[, match_type])
 | 
						||
```
 | 
						||
 | 
						||
#### 例子
 | 
						||
 | 
						||
```sql
 | 
						||
mysql> SELECT regexp_like('aba', 'b+')
 | 
						||
1
 | 
						||
mysql> SELECT regexp_like('aba', 'b{2}')
 | 
						||
0
 | 
						||
mysql> # i: case-insensitive
 | 
						||
mysql> SELECT regexp_like('Abba', 'ABBA', 'i');
 | 
						||
1
 | 
						||
mysql> # m: multi-line
 | 
						||
mysql> SELECT regexp_like('a\nb\nc', '^b$', 'm');
 | 
						||
1
 | 
						||
```
 | 
						||
 | 
						||
### REGEXP_INSTR
 | 
						||
 | 
						||
```
 | 
						||
REGEXP_INSTR(expr, pat[, pos[, occurrence[, return_option[, match_type]]]])
 | 
						||
```
 | 
						||
 | 
						||
#### 例子
 | 
						||
 | 
						||
```sql
 | 
						||
mysql> SELECT regexp_instr('aa aaa aaaa', 'a{3}');
 | 
						||
2
 | 
						||
mysql> SELECT regexp_instr('abba', 'b{2}', 2);
 | 
						||
2
 | 
						||
mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 2);
 | 
						||
5
 | 
						||
mysql> SELECT regexp_instr('abbabba', 'b{2}', 1, 3, 1);
 | 
						||
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)_
 |