所有加粗的元字符的双引号均为了方便表示,所有的正则表达式均在 ‘’ ——单引号中
“/b”:元字符,代表单词的开始或者结尾,即单词的分界,用于明确匹配
例如,我们匹配 ‘jy’:‘\bjy\b’就可以精确匹配,hello,jy,ps:标点符号的连接不影响匹配结果
“.”:元字符,匹配除换行符以外的所有字符
“*”:元字符,代表“*”前面位置的内容可以使用任意次,包括零次,如‘.*’,任意数量不包含换行符的字符
“+”:元字符,代表“+”前面位置的内容可以使用任意次,不包括零次,如‘.*’,任意数量不包含换行符的字符
“?”:元字符,匹配0次或者一次
“{n}”:匹配n次
“{n,}”:匹配n次或者更多
“{m,n}”:匹配m-n次,‘029-\d{2,5}-\d{3,}’,匹配029-开头的,接2-5个数字,接‘-’,接3个以上数字
“\d”:元字符,代表匹配数字,如,‘\d\d-\d\d\d’,代表2个数字接一个‘-’,接3个数字,为方便起见,可以这样写,‘\d{2}-\d{3}’
“\s”:匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等
“\w”:匹配字母或数字或下划线或汉字等
“^”:匹配你要用来查找的字符串的开头,‘^\w+’匹配一行的第一个单词(或整个字符串的第一个单词,具体匹配哪个意思得看选项设置)
“$”:匹配结尾,例如 ‘^\d{4,9}$’,匹配5-9个数字,
这是匹配在整个对象中进行,如果模式为按行匹配,那么它们代表行起始和结束
对元字符的匹配,需要 ‘\’ 来实现,譬如,‘\.’ 匹配 ‘.’,‘\*’匹配 ‘*’ ,‘\\’匹配 ‘\’, ‘C:\\Windows’匹配 ‘C:\Windows’
匹配自定义字符集,[ ]:例如只需要匹配 a,b,c,d,e,可以这样写[abcde];[0-9],匹配数字;[a-z]匹配小写字母;[A-Z]匹配大写字母;[a-z0-9A-Z]匹配任意数组或者字母
c中,识别标识符的正则表达式:‘\b[a-zA-Z]+[a-zA-Z0-9_]*\b’
分支条件:正则表达式使用 ‘|’ 表示分支条件
‘0\d{2}-\d{8}|0\d{3}-\d{7}’ 这个表达式能匹配两种以连字号分隔的电话号码:一种是三位区号,8位本地号(如010-12345678),一种是4位区号,7位本地号(0376-2233445)
‘\(?0\d{2}\)?[- ]?\d{8}|0\d{2}[- ]?\d{8}’ 这个表达式匹配3位区号的电话号码,其中区号可以用小括号括起来,也可以不用,区号与本地号间可以用连字号或空格间隔,也可以没有间隔,存在问题:(029-12345678
分组:正则表达式使用小括号来表示子表达式,也叫做分组,用于重复匹配多个字符,例如,‘(\d{1,3}\.){3}\d{1,3}’ 用于匹配类似 ipv4格式的串。
这里给一个正确的ip匹配格式:‘((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)’, ‘2[0-4]\d|25[0-5]|[01]?\d\d?’ 匹配200-249或者250-255或者0-199,至此整个结构就简单了
正则表达式为每一个分组分配一个组号,1代表第一个分组,0代表整个表达式,其规则是按照左括号来进行匹配,而且实际分配过程从左至右扫描两遍,第一遍为未命名分组编号,第二遍为命名分组编号,故而命名分组的标号都大于未命名分组。
反义:查找不属于某个能简单定义的字符类的字符
例:‘\S+’ 匹配不包含空白符的字符串,‘<a[^>]+>’ 匹配用尖括号括起来的以a开头的字符串
向后引用:用于重复搜索前面某个分组匹配的文本
‘\b(\w+)\b\s+\1\b’ 可以用来匹配重复的单词,像go go, 或者kitty kitty,\1代表分组(第一个分组)之前捕获的单词,直接拿来用了;自己命名分组,‘\b(?<word>\w+)\b\s+\k<word>\b’ ,\k代表反向引用
小括号还有许多其他用法:
零宽断言:(?=exp),零宽度正预测先行断言,它断言自身出现的位置的后面的匹配表达式exp,例如'\b\w+(?=ing\b)',匹配以ing结尾的单词,不包括img本身,I'm going to stay with you. 匹配到‘go’;(?=<exp),零宽度正回顾后发断言,它断言自身出现的位置的前面的匹配表达式exp,例如‘(\bre)\w+\b’,匹配以re开头的单词的后半部分,rectify,匹配到ctify。
‘(?<=\s)\d+(?=\s)’ 匹配以空白符间隔的数字
负向零宽断言:确保某个字符没有出现,但并不想去匹配它,只匹配一个字符,不消费其他字符
零宽度负预测先行断言(?!exp):断言此位置的后面不能匹配表达式exp
'\b\w*q(?!u)\w*\b',匹配包含后面不是字母u的字母q的单词;'\d{3}(?!\d)'匹配三位数字,而且这三位数字的后面不能是数字;'\b((?!abc)\w)+\b'匹配不包含连续字符串abc的单词
零宽度负回顾后发断言(?<!exp):断言此位置的前面不能匹配表达式exp
(?<![a-z])\d{7}:匹配前面不是小写字母的七位数字
(?<=<(\w+)>).*(?=<\/\1>):比配html标签<exp>*</exp>
注释:(?#comment) 此代表注释,被正则表达式忽略,譬如2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)
贪婪匹配与懒惰匹配:正则表达式默认为贪婪匹配,即匹配尽可能长的串,如'a\w+b',匹配'ababba'时匹配到'ababb',若要使用懒惰匹配,如下:
递归匹配:为了匹配成对的符号,如(),[],""之类的,使用堆栈来完成:
(?'group')把捕获的内容命名为group,并压入堆栈(Stack);
(?'-group')从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败;
(?(group)yes|no)如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分;
(?!)零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败。