正则表达式30分钟入门教程笔记
正则表达式30分钟入门教程笔记
之前用everything时感到很有学习正则表达式的必要,零零散散学过一些,这次来做个总结。
先放网址正则表达式30分钟入门教程(感谢娄老师的推荐)
-
\b:表示元字符,匹配单词的开始与结束,参考全字匹配。
例:\bhi\b可用于搜索hi字样
-
*:任意数量(0~∞),与windows表示任意多个字符不同
.:表示换行符外的任意字符
.*:任意多个换行符外的任意字符
例: \bhi\b.*\bLucy\b表示hi后面不远处跟着一个Lucy
-
\d:单个数字
{}:数量重复范围。{a}表示a次,{a,b}表示a到b次
例: 0\d\d-\d\d\d\d\d\d\d\d表示以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字的字符串,也可用 0\d{2}-\d{8}表示。{2}({8})的意思是前面\d必须连续重复匹配2次(8次)
-
\w:字母或数字或下划线或汉字
例: \ba\w*\b匹配以字母a开头的单词——先是某个单词开始处(\b),然后是字母a,然后是任意数量的字母或数字(\w*),最后是单词结束处(\b)
-
+:任意数量数字(1~∞)
例: \d+匹配1个或更多连续的数字
-
^:匹配字符串开始
$:匹配字符串结束
例: ^\d{5,12}$5位到12位数字qq
?与\b的区别暂时没有搞明白
-
\:转义字符:取消特殊意,写Markdown时就应该很熟练了
-
\s:匹配任意空白符
-
[]:匹配字符集合中的元字符,可限定范围合并使用
例:[aeiou]匹配所有元音字母,[a-z0-9A-Z]相当于\w,
练习:\(?0\d{2}[) -]?\d{8} 可匹配几种格式的电话号码,像(010)88886666,或022-22334455,或02912345678等 , 首先是一个转义字符\(,它能出现0次或1次(?),然后是一个0,后面跟着2个数字(\d{2}),然后是)或-或空格中的一个,它出现1次或不出现(?),最后是8个数字(\d{8}) 。
不幸的是,这个表达式也能匹配010)12345678或(022-87654321这样的“不正确”的格式,为此引入如下分枝条件:
-
|:隔开可匹配不同规则格式,使用方式与或相同,但应注意顺序,如if与else if的用法
例:\d{5}-\d{4}|\d{5} 可表示五位数字或5位-4位的数字,如果倒置为\d{5}|\d{5}-\d{4} ,在遇到5-4型时会提前匹配
为重复多个字符,引入子表达式|分组
-
():对多个字符进行匹配
例: ((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?) 用来匹配ip地址
为找到除了某些字符外的字符,引入反义
-
^:字面意
例:\S+匹配不包含空白符的字符串。<a[^>]+>匹配用尖括号括起来的以a开头的字符串
-
\num:表示第num个分组的值,从组1开始,组0表示整个正则表达式
分析:\b(\w+)\b\s+\1\b可以用来匹配重复的单词,像go go, 或者kitty kitty。这个表达式首先是一个单词,也就是单词开始处和结束处之间的多于一个的字母或数字(\b(\w+)\b),这个单词会被捕获到编号为1的分组中,然后是1个或几个空白符(\s+),最后是分组1中捕获的内容(也就是前面匹配的那个单词)(\1)。
-
(
)|('Name'): 设定分组名,可用\k引用捕获内容 例: \b(?
\w+)\b\s+\k \b等同于上例 为在句中查找以某些字符为开头或结尾(位置)的部分,引入零宽断言
-
(?=exp): 零宽度正预测先行断言
例:\b\w+(?=ing\b)匹配 I'm singing while you're dancing. 中的sing与danc(注意\b的位置)
-
(?<=exp):零宽度正回顾后发断言
例:(?<=\bre)\w+\b匹配 reading a book中的ading
以下为负向零宽断言,相当于零宽断言的反义
-
(?!exp): 零宽度负预测先行断言
例: \d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字
?\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词
-
(?<!exp): 零宽度负回顾后发断言
例: (?<![a-z])\d{7}匹配前面不是小写字母的七位数字
-
(?#comment):注释
例: 2[0-4]\d(?#200-249)|250-5|[01]?\d\d?(?#0-199)
-
贪婪匹配:匹配尽量多的字符
例:用a.*b匹配aabab,即得到aabab
-
懒惰匹配:匹配尽量少的字符
例:用a.*?b匹配aabab,即得到aab与ab(暗含规则:最先开始的匹配拥有最高的优先权)
总结表
常用元字符
代码 | 说明 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
常用限定符(重复)
代码/语法 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或更多次 |
? | 重复零次或一次 |
重复n次 | |
重复n次或更多次 | |
重复n到m次 |
常用反义代码
代码/语法 | 说明 |
---|---|
\W | 匹配任意不是字母,数字,下划线,汉字的字符 |
\S | 匹配任意不是空白符的字符 |
\D | 匹配任意非数字的字符 |
\B | 匹配不是单词开头或结束的位置 |
[^x] | 匹配除了x以外的任意字符 |
[^aeiou] | 匹配除了aeiou这几个字母以外的任意字符 |
常用分组语法
懒惰限定符
代码/语法 | 说明 |
---|---|
*? | 重复任意次,但尽可能少重复 |
+? | 重复1次或更多次,但尽可能少重复 |
?? | 重复0次或1次,但尽可能少重复 |
{n,m}? | 重复n到m次,但尽可能少重复 |
{n,}? | 重复n次以上,但尽可能少重复 |