正则表达式入门

所有加粗的元字符的双引号均为了方便表示,所有的正则表达式均在 ‘’ ——单引号中

“/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部分;

(?!)零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341

推荐阅读更多精彩内容

  • 正则表达式到底是什么东西?字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等...
    狮子挽歌阅读 2,134评论 0 9
  • 注:本篇文章只为方便查看,特此保留,如有冒犯,敬请谅解!!! 本文目标 30分钟内让你明白正则表达式是什么,并对它...
    阿杰Alex阅读 1,474评论 0 10
  • 前言 俩件事促使我写这篇文章。一则之前面试面试到了正则,发现不甚熟悉。二则这些天看jQuery源码,一些正则看的有...
    nymlc阅读 344评论 1 1
  • 最简单的单独匹配一个单词,如匹配blue.需要使用\b.它是元字符,代表着单词的开头或者结尾.只匹配一个位置.如匹...
    BlueBeginner阅读 430评论 0 2
  • 什么是正则表达式呢? 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一...
    chenxiaoer阅读 403评论 0 1