正则表达式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. 中的singdanc(注意\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次以上,但尽可能少重复
posted @ 2020-09-21 15:23  一个李长兴  阅读(186)  评论(0编辑  收藏  举报