关于正则表达式的一些感悟

这两天又看了一下正则表达式的入门手册,有些原来没有注意到的东西,记录一下。

匹配类型

有些元字符只匹配位置

  • \b
  • ^
  • $

有些元字符只匹配数量

  • *
  • +
  • ?

[]中是用来放匹配的字符的,所以匹配位置的东西在里面是无效的

比如我想匹配0:忙,1:闲中的枚举,如果我用下面的正则是无法匹配的:
([\dH]+):(.*?)[,;$]
因为$[]中表示的是字符而不是位置. 正确的写法是:
([\dH]+):(.*?)([,;]|$)

.*?的解释

.匹配任意字符,*匹配任意数量,?使用懒惰模式

后向引用

例:\b(\w+)\b\s+\1\b匹配重复的单词,像go go, 或者kitty kitty

零宽断言

断言的目的是使用字符串匹配位置但不匹配任何字符串,即被断言匹配的字符串仍然可以继续被匹配。另一种角度来说,可以用来判断字符串中是否包含某字符串(因为不会匹配任何字符串)。

  • (?=exp) 零宽度正预测先行断言
  • (?<=exp) 零宽度正回顾后发断言
  • (?!exp) 零宽度负预测先行断言
  • (?<!exp) 零宽度负回顾后发断言
    例:\b\w*q(?!u)\w*\b匹配包含后面不是字母u的字母q的单词
    理解:正与负其实是==和!=的意思;先和后其实是匹配所在位置右边和左边的意思(因为这个写在正则表达式中间分不清是与前面的东西配合还是与后面的东西配合)。

例:

  • 匹配后面为_path,结果为product
    'product_path'.scan
    /(product)(?=_path)/
    (?<=exp):零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp
  • 匹配前面为name:,结果为wangfei
    'name:wangfei'.scan
    /(?<=name:)(wangfei)/
    (?!exp):零宽度负预测先行断言,断言此位置的后面不能匹配表达式exp。
  • 匹配后面不是_path
    'product_path'.scan
    /(product)(?!_path)/
  • 匹配后面不是_url
    'product_path'.scan
    /(product)(?!_url)/
    (?<!exp):零宽度负回顾后发断言来断言此位置的前面不能匹配表达式exp
  • 匹配前面不是name:
    'name:angelica'.scan
    /(?<!name:)(angelica)/
  • 匹配前面不是nick_name:
    'name:angelica'.scan
    /(?<!nick_name:)(angelica)/

多行模式和单行模式并不是反义词

  • 多行模式:^$分别匹配任意一行的行首和行尾
  • 单行模式:.也匹配换行符\n

体会

  • 之前一直用{1,}来表示重复1次及以上,其实用+就可以
  • 要搞明白使用正则表达式的库的函数都是干什么用的,下篇就写这个吧

常用正则表达式

  • IP:(([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5]).){3}([1‐9]?\d|1\d{2}|2[0‐4]\d|25[0‐5])
  • IP:((?:(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|[01]?\\d?\\d))
  • Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  • 手机号码:^(13[0-9]|14[0-9]|15[0-9]|166|17[0-9]|18[0-9]|19[8|9])\d{8}$
  • 强密码(包含大小写、数字,无特殊字符,长度8-10):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$(断言)
  • 日期格式:^\d{4}-\d{1,2}-\d{1,2}
  • 中文字符:[\u4e00-\u9fa5]
  • 空白行:\n\s*\r^\s*\n

还没搞明白的特殊匹配方法

平衡组/递归匹配

参考

https://www.jb51.net/tools/zhengze.html

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

推荐阅读更多精彩内容

  • 正则表达式到底是什么东西?字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等...
    狮子挽歌阅读 2,147评论 0 9
  • 注:本篇文章只为方便查看,特此保留,如有冒犯,敬请谅解!!! 本文目标 30分钟内让你明白正则表达式是什么,并对它...
    阿杰Alex阅读 1,483评论 0 10
  • 版本:v2.3.5 (2017-6-12) 作者:deerchao 转载请注明来源 目录 跳过目录 本文目标 如何...
    readilen阅读 960评论 2 13
  • 原文:http://www.jb51.net/tools/zhengze.html 然后强迫症如我,因为我怕网页哪...
    你再不来我要下雪了阅读 836评论 1 6
  • 简介/声明 为什么要写此文呢?稍微有点Web基础的同学应该都知道网页的表单大多都要做表单验证。而正则表达式正好可以...
    Airmole阅读 1,669评论 4 21