正则表达式的作用
- 测试目标字符串是否符合规则 返回true/false
- 按照规则从目标字符串提取内容 返回匹配的数组
在线测试工具
regex101: build, test, and debug regexRegular expression tester with syntax highlighting, explanation, cheat sheet for PHP/PCRE, Python, GO, JavaScript, Java, C#/.NET, Rust.
https://regex101.com/
Rubular: a Ruby regular expression editor
https://rubular.com/
正则表达式的组成成分
正则表达式的组成成分,记住口诀:定元限排选转分。
- 定位符 定位符用来指定匹配的边界。定位符有
^和$,分别指定匹配的内容以什么开头,和以什么结尾。 - 元字符 元字符用来指定相关字符元素是什么类型的字符。
- 限定符 限定符用来指定相关字符出现的次数。
- 排除字符 排除字符用来指定相关字符不为某种字符。
- 选择字符 选择字符用来表示多选项匹配。
- 转义字符 转义字符用来表示与元字符冲突的原始字符。
- 分组 分组用来在正则表达式中划出一个子表达式作为一个小组,这个小组看成一个整体,方便对其应用限定符、排除字符和选择字符。
定位符
定位符用来指定匹配的边界。
定位符有^和$,分别指定匹配的内容以什么开头,和以什么结尾。
元字符
元字符用来指定相关字符元素是什么类型的字符。代表一类字符,如数字,空白字符,非数字字符。
| 符号 | 代表意思 | 使用场景 |
|---|---|---|
| . | 匹配除换行符之外的所有字符 | . 单个换行符之外所有字符 |
| \d | 匹配数字0-9 | \d 匹配单个数字,1、2、3 |
| \D | 匹配非数字 | \D 匹配单个非数字,a、-、' |
| \w | 匹配字母、数字、下划线 | \w 匹配单个字母、数字、下划线,a、1、_ |
| \W | 匹配非字母、数字、下划线 | \W 匹配单个非字母、数字、下划线,{、-、[ |
| \s | 匹配空白字符 | \s 匹配单个空格、回车(\n)、制表符(\t) |
| \S | 匹配非空白字符 | \S 匹配单个非空格、换行(\n)、制表符(\t) |
| \b | 匹配单词的开始或结束,单词的分界符通常是空格,标点符号或换行。 | 在“I like mr or am"字符串中,\bm与mr中的m相匹配,但与am中的m不匹配 |
捕获组
- 普通捕获组(Expression)
- 命名捕获组(?<命名>Expression)
- 非捕获组(?:Expression)
普通捕获组
从正则表达式左侧开始,每出现一个左括号"("记做一个分组,分组编号从 1 开始。0 代表整个表达式。
对于时间字符串:2017-04-25,表达式如下
(\\d{4})-((\\d{2})-(\\d{2}))
有 4 个左括号,所以有 4 个分组:
| 编号 | 捕获组 | 匹配 |
|---|---|---|
| 0 | (\d{4})-((\d{2})-(\d{2})) | 2017-04-25 |
| 1 | (\d{4}) | 2017 |
| 2 | ((\d{2})-(\d{2})) | 04-25 |
| 3 | (\d{2}) | 04 |
| 4 | (\d{2}) | 25 |
命名捕获组
每个以左括号开始的捕获组,都紧跟着 ?,而后才是正则表达式。
对于时间字符串:2017-04-25,表达式如下:
(?<year>\d{4})-(?<md>(?<month>\d{2})-(?<date>\d{2}))
有 4 个命名的捕获组,分别是:
| 编号 | 名称 | 捕获组 | 匹配 |
|---|---|---|---|
| 0 | 0 | (?\d{4})-(?(?\d{2})-(?\d{2})) | 2017-04-25 |
| 1 | year | (?\d{4})- | 2017 |
| 2 | md | (?(?\d{2})-(?\d{2})) | 04-25 |
| 3 | month | (?\d{2}) | 04 |
| 4 | date | (?\d{2}) | 25 |
命名的捕获组同样也可以使用编号获取相应值。
非捕获分组
| 模式 | 描述 |
|---|---|
| (?: re) | 对正则表达式进行分组,但不记住匹配文本。 |
比如说要查找,单词前缀字母个数为1个或2个的母体单词,要匹配的文本如下:
d-order
re-call
anti-war
macro-world
micro-world
非捕获表达式:
/(?:^[a-zA-Z]{1}|^[a-zA-Z]{2})-(?<word>[a-zA-Z]+)/gm
结果

捕获表达式
(?^[a-zA-Z]{1}|^[a-zA-Z]{2})-(?<word>[a-zA-Z]+)
结果 ,这个是包含group 1的,与非捕获表达式:



















