正则表达式的作用
- 测试目标字符串是否符合规则 返回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 editorhttps://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的,与非捕获表达式: