ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
### 元字符 | 代码 | 说明 | | :-----: | ----- | | `*` | 匹配重复任意次(包括0次)| | `+` | 匹配一次或多次(至少一次)| | `.` | 匹配除换行符以外的任意字符| | `\w` | 匹配字母或数字或下划线或汉字| | `\s` | 匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格| | `\d` | 匹配数字| | `\b` | 匹配单词开始或结束| | `^` | 匹配字符串开始| | `$` | 匹配字符串结尾| <!--more--> ### 字符转义 如果想要查找匹配字符本身,则需要进行字符转义,转义符`\`,例如:`\.`,`\*`,`\\` ### 重复 | 代码 | 说明 | | ----- | ----- | | `*` | 重复0次或更多次| | `+` | 重复1次或更多次| | `?` | 重复0次或1次| | `{n}` | 重复n次| | `{n,}` | 重复n次或更多次| | `{n,m}` | 重复n到m次| ### 字符类 在方括号`[]`里列出即可,如: ```js [a-zA-z0-9] [abedcdoi?!] ``` ### 分支条件 用`|`将几种规则分割开,满足其中任意一种即匹配成功,栗子: `0\d{2}-\d{8}|0\d{3}-\d{7}`:这个表示`0`开头,然后`2`位数字,加`-`,加`8`位数字,或者`0`开头,加`3`位数字,加`-`,加`7`位数字,比方: `012-12345678`或者`0123-1234567` 注意:匹配分枝条件时,将会从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的条件了。所以特别要注意顺序 ### 分组 分组是通过标识符`()`来进行整体的分组匹配的,栗子: 一个简单的ip匹配:`(\d{1,3}\.){3}\d{1,3}` `\d{1,3}`匹配1到3位的数字,`(\d{1,3}\.){3}`匹配三位数字加上一个英文句号(这个整体也就是这个分组)重复3次,最后再加上一个一到三位的数字`(\d{1,3})` 正确的ip匹配`((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)` ### 反义符 | 代码 | 说明 | | ----- | ----- | | `\W` | 匹配任意不是字母,数字,下划线,汉字的字符| | `\S` | 匹配任意不是空白符的字符| | `\D` | 匹配任意非数字的字符| | `\B` | 匹配不是单词开头或结束的位置| | `[^x]` | 匹配除了x以外的任意字符| | `[^aeiou]` | 匹配除了aeiou这几个字母以外的任意字符| #### 更多高级功能 #### 后项引用 使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。 后项引用就是:重复搜索前面某个分组匹配到的文本. 例如: `\b(\w+)\b\s+\1\b`可以用来匹配重复的单词,像`go go`, 或者`kitty kitty`。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字`(\b(\w+)\b)`,这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符`(\s+)`,最后是分组1中捕获的内容(也就是前面匹配的那个单词)`(\1)`。 你也可以自己指定子表达式的组名。要指定一个子表达式的组名,请使用这样的语法:`(?<Word>\w+)`(或者把尖括号换成`'`也行:`(?'Word'\w+))`,这样就把`\w+`的组名指定为`Word`了。要反向引用这个分组捕获的内容,你可以使用`\k<Word>`,所以上一个例子也可以写成这样:`\b(?<Word>\w+)\b\s+\k<Word>\b`。 常用的分组: | 分类 | 代码 | 说明 | | ---- | ---- | ---- | | 捕获 | `(exp)` | 匹配exp,并捕获文本到自动命名的组里| | | `(?<name>exp)` | 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)| | | `(?:exp)` | 匹配exp,不捕获匹配的文本,也不给此分组分配组号| | 零宽断言| `(?=exp)` | 匹配exp前面的位置| | | `(?<=exp)` | 匹配exp后面的位置| | | `(?!exp)` | 匹配后面跟的不是exp的位置| | | `(?<!exp)` | 匹配前面不是exp的位置| | 注释 | `(?#comment)` | 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读| #### 零宽断言 > 断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。 > `(?=exp)`,零宽度正预测先行断言,断言自身出现的位置的后面能匹配表达式exp ----以xxx结尾 > `(?<=exp)`,宽度正回顾后发断言,断言自身出现的位置的前面能匹配表达式exp ----以xxx开头 #### 负向零宽断言 > `(?!exp)`,零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp ---不以xxx结尾 > `(?<!exp)`,零宽度负回顾后发断言,断言此位置的前面不能匹配表达式exp ---不以xxx开头 #### 注释 `(?#comment)` #### 贪婪与懒惰 #### 处理选项 #### 平衡组/递归匹配 #### More... ### 参考文档 1. [正则表达式30分钟入门指南](https://deerchao.net/tutorials/regex/regex.htm) 2. [.NET Framework 正则表达式](https://msdn.microsoft.com/zh-cn/library/hs600312.aspx) <p class="over">Over!</p>