正则表达式
字符 | 功能 |
---|---|
. | 匹配任意一个字符(除了\n),“\.” 匹配"."本身 |
[] | 匹配[]中列举的字符串 |
\d | 匹配数字0-9 |
\D | 匹配非数字 |
\s | 匹配空白,即空格、tab键 |
\S | 匹配非空白 |
\w | 匹配单词字符,即a-z,A-Z,0-9,_ |
\W | 匹配非单词字符 |
字符 | 功能 |
---|---|
* | 匹配前一个规则的字符出现0或无数次 |
+ | 匹配前一个规则的字符出现1或无数次 |
? | 匹配前一个规则的字符出现0或1次 |
{m} | 匹配前一个规则的字符出现m次 |
{m,} | 匹配前一个规则的字符出现至少m次 |
{m,n} | 匹配前一个规则的字符出现m到n次 |
字符 | 功能 |
---|---|
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
\b | 匹配一个单词边界 |
\B | 匹配非单词边界 |
| | 或,匹配左右任意一个表达式 |
( ) | 将括号中的字符串作为一个分组 |
贪婪or非贪婪
贪婪匹配:(.*) | 非贪婪匹配:(.*?) |
---|---|
获取最长的满足条件的字符串 | 获取最短的能满足条件的字符串 |
eg:
我的微博密码是:1234567,QQ密码是:33445566, 银行卡密码是:888888,Github密码是:999abc999,帮我记住它们
贪婪匹配:匹配规则:“密码是:(.*)”
结果:
“1234567,QQ密码是:33445566, 银行卡密码是:888888,Github密码是:999abc999” (长度为1)
非贪婪匹配:匹配规则:“密码是:(.*?)”
结果:
“1234567”, “33445566”, “888888”, “999abc999” ( 长度为4)
前瞻or后顾
前瞻 = 先行断言 紧跟在模式字符串后面的位置满足指定条件
后顾 = 后发断言 紧跟在模式字符串前面的位置满足指定条件
正向or反向
正向 模式字符串前或后面是它所给条件
反向 模式字符串前或后面不是它所给条件
(反向,即反着来,不按要求来)
组合
(?=) 正向前瞻 = 正向零宽先行断言
(?!) 反向前瞻 = 负向前瞻 = 负向零宽先行断言
(?<=) 正向后顾 = 正向零宽后发断言
(?<!) 反向后顾 = 负向后顾 = 负向零宽后发断言
示例
反向前瞻断言示例: 假设我们要匹配包含"apple"的单词,但只有在"apple"后面不跟着"pie"的情况下才匹配。我们可以使用反向前瞻断言来实现这一点。
正则表达式:apple(?!pie)
字符串:I like apple pie and apple juice
匹配结果:apple(第二个"apple"匹配成功,因为它后面不跟着"pie")