正则表达式
什么是正则表达式?
正则表达式是一组由字母和符号组成的特殊文本,它可以用来从文本中找出满足你想要的格式的句子。
参考 菜鸟教程-正则表达式
参考git著名3w star的项目 learn-regex
在线练习地址:https://regex101.com/
正则的用处
- 数据验证
- 替换文本
- 提取子字符串
标记符举例&简写字符集讲解
正则以/expression/的形式呈现
- .表示除了"新行"之外的所有字符
- .*代表任意字符串,贪婪模式,最大化匹配
- .*?代表任意字符串,非贪婪模式,遇到第一个结束符就停
- ^是匹配字符串的开始位置,当在一组方括号里使用 ^ 时,它表示"非"或"排除"的意思,常常用来剔除某个字符
- [a-z]表示字母,[ ^a-z]表示任意非字母
- “[0-9]“表示一个数字
- ”[0-9]+“ 表示多个数字
- 以上为中括号表达式,其中-可以表示范围,按 Unicode 排序顺序
- abc$表示以abc结尾的字符串
- x|y表示x或者y
- [xyz]字符集合,表示i匹配里面的任意一个字符
- [^xyz]表示除了xyz意外的所有任意字符
- \b匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'
- \B匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

不同括号的区别
1、圆括号是取多个,圆括号将括号里面的内容作为一组,方括号是取一个,就算写成这样 [es|ed|s|ly|ing|d]也是一个个取,正确做法是用圆括号
2、方括号里面的|选择符号没有意义
3、圆括号还表示组,表示反向引用,
4、大括号表示数目
语法
正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。
正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。
1.普通字符
普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
2.限定符
- +表示前面的字符至少出现一次
- *表示前面的字符零个或者多个
- ?表示前面的字符匹配0个或者一个
在上面字符后加上?表示由贪婪匹配转化为非贪婪匹配
- {n}表示前面的字符固定出现n次
- {n,}表示前面的字符出现n到正无穷次
- {n,m}表示前面的字符出现n到m次
3.特殊字符
以下字符在使用是必须加\进行转义,因为本身为特殊含义
$ ( ) * + . [ ? ] \ ^ { | }
4.定位符
- ^表示字符串开始的文字,如^fay表示从fay开始
- $表示字符串结束的文字
- \b
- \B
5.标志
| 标志 | 描述 |
|---|---|
| i | 忽略大小写。 |
| g | 全局搜索。 |
| m | 多行修饰符:锚点元字符 ^ $ 工作范围在每行的起始。 |
标志在/expression/之后写,为了修改表达式搜索结果可任何组合使用
g表示返回所有的结果而不是只匹配到第一个
如果不使用m,则定位符只会在字符串的开头结尾,如果加上m则表示在多行都有
如以下会把fat,sat,mat都搜到:
"/.at(.)?$/gm" => The fat
cat sat
on the mat.
6.圆括号表达式
完全匹配
(xyz)表示与xyz完全相等的字符串,常与{}搭配使用
选择
用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。
如匹配章节/^(Chapter|Section) [1-9][0-9]{0,1}$/
但是括号还将捕获两个匹配字中的任一个供以后使用,若要防止匹配被保存以备将来使用,在括号内正则表达式模式之前放置 ?:
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/
反向引用
零宽度断言(前后预查)
先行断言和后发断言都属于非捕获簇(不捕获文本 ,也不针对组合计进行计数)。 先行断言用于判断所匹配的格式是否在另一个确定的格式之前,匹配结果不包含该确定格式(仅作为约束)。
例如,我们想要获得所有跟在 $ 符号后的数字,我们可以使用正后发断言 (?<=\$)[0-9\.]*。 这个表达式匹配 $ 开头,之后跟着 0,1,2,3,4,5,6,7,8,9,. 这些字符可以出现大于等于 0 次。
零宽度断言如下:
| 符号 | 描述 |
|---|---|
| ?= | 正先行断言-存在 |
| ?! | 负先行断言-排除 |
| ?<= | 正后发断言-存在 |
| ?<! | 负后发断言-排除 |
7.运算符优先级
- 转义符
- 圆括号和方括号(), (?:), (?=), []
- 限定符*, +, ?, {n}, {n,}, {n,m}
- 任何元字符和字符
- 或操作|
举例
^[a-zA-Z0-9_]{1,}$ // 所有包含一个以上的字母、数字或下划线的字符串
^[1-9][0-9]{0,}$ // 所有的正整数
^\-{0,1}[0-9]{1,}$ // 所有的整数
^[-]?[0-9]+\.?[0-9]+$ // 所有的浮点数
以上也可以表达为
^[a-zA-Z0-9_]+$ // 所有包含一个以上的字母、数字或下划线的字符串
^[1-9][0-9]*$ // 所有的正整数
^\-?[0-9]+$ // 所有的整数
^[-]?[0-9]+(\.[0-9]+)?$ // 所有的浮点数
($表示没有其他字符在最后)
/<\s*(\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/ 匹配 HTML 标记。
/\b([a-z]+) \1\b/gi 一个单词连续出现的位置。
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ 将一个URL解析为协议、域、端口及相对路径。
/^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章节的位置。