理解正则表达式

正则表达式是一个很好的工具,但是每次看到正则表达式的语法就看的头大,导致每次都草草的看了下语法,但是实际应用的时候即使是一个很小的问题也不知道该怎么写,以致于每次都是靠百度,自己始终都不会,甚至有点恐惧解除正则。现在想了下应该是起初的时候就不理解正在表达式的用途,不明白什么时候需要用,使用的思路以及一些概念不明。后来看了几篇博客,讲的很清楚,在这里分享给大家,也算再自己巩固下。相关参考文章,写在各节末尾。

一、基本理解

1、正则表达式是匹配模式,要么匹配字符,要么匹配位置。请记住这句话。
2、匹配模式分为:精确匹配模糊匹配
3、模糊匹配,有两个方向上的“模糊”:横向模糊纵向模糊
4、横向模糊指的是:一个正则可匹配的字符串的长度不是固定的,可以是多种情况的。其实现的方式是使用量词。譬如{m,n},表示连续出现最少m次,最多n次。
5、纵向模糊指的是:一个正则匹配的字符串,具体到某一位字符时,它可以不是某个确定的字符,可以有多种可能。其实现的方式是使用字符组。譬如[abc],表示该字符是可以字符“a”、“b”、“c”中的任何一个。
6、JS正则表达式中,都有哪些结构呢?

字符字面量、字符组、量词、锚字符、分组、选择分支、反向引用。

具体含义简要如下:

字面量:匹配一个具体字符,包括不用转义的和需要转义的。比如a匹配字符"a",又比如\n匹配换行符,又比如.匹配小数点。
字符组:匹配一个字符,可以是多种可能之一,比如[0-9],表示匹配一个数字。也有\d的简写形式。另外还有反义字符组,表示可以是除了特定字符之外任何一个字符,比如[^0-9],表示一个非数字字符,也有\D的简写形式。
量词:表示一个字符连续出现,比如a{1,3}表示“a”字符连续出现3次。另外还有常见的简写形式,比如a+表示“a”字符连续出现至少一次。
锚点:匹配一个位置,而不是字符。比如^匹配字符串的开头,又比如\b匹配单词边界,又比如(?=\d)表示数字前面的位置。
分组:用括号表示一个整体,比如(ab)+,表示"ab"两个字符连续出现多次,也可以使用非捕获分组(?:ab)+。
分支:多个子表达式多选一,比如abc|bcd,表达式匹配"abc"或者"bcd"字符子串。
反向引用:比如\2,表示引用第2个分组。

7、简写
①字符组是[]的简写

常见的简写形式有了字符组的概念后,一些常见的符号我们也就理解了。因为它们都是系统自带的简写形式。
1、\d就是[0-9]。表示是一位数字。记忆方式:其英文是digit(数字)。
2、\D就是[^0-9]。表示除数字外的任意字符。
3、\w就是[0-9a-zA-Z_]。表示数字、大小写字母和下划线。记忆方式:w是word的简写,也称单词字符。
4、\W[^0-9a-zA-Z_]。非单词字符。
5、\s是[ \t\v\n\r\f]。表示空白符,包括空格、水平制表符、垂直制表符、换行符、回车符、换页符。记忆方式:s是space character的首字母。
6、\S[^ \t\v\n\r\f]。 非空白符。.就是 [ ^ \n\r\u2028\u2029]。
7、通配符,表示几乎任意字符。换行符、回车符、行分隔符和段分隔符除外。记忆方式:想想省略号...中的每个点,都可以理解成占位符,表示任何类似的东西。如果要匹配任意字符怎么办?可以使用[\d\D]、[\w\W]、[\s\S]和[^]中任何的一个。

②量词是{}的简写

量词也称重复。掌握{m,n}的准确含义后,只需要记住一些简写形式。
1、{m,} 表示至少出现m次
2、{m} 等价于{m,m},表示出现m次。
3、? 等价于{0,1},表示出现或者不出现。记忆方式:问号的意思表示,有吗?
4、+ 等价于{1,},表示出现至少一次。记忆方式:加号是追加的意思,得先有一个,然后才考虑追加。
5、* 等价于{0,},表示出现任意次,有可能不出现。记忆方式:看看天上的星星,可能一颗没有,可能零散有几颗,可能数也数不过来。

参考文章:

1、JS正则表达式完整教程(略长)
2、 正则表达式的基本用法

二、基本语法

正则表达式方法:test(),exec()(通过RegExp对象去调用,参数是字符串)
String对象方法:match(),search(),replace(),split()(通过字符串去调用,参数是正则表达式)
//ToDo exec()、match()的区别待整理

参考文章:

1、javascript正则表达式总结(test|match|search|replace|split|exec)
2、 正则表达式中的exec和match方法的区别

三、基本思路

1、明确要验证的规则
2、拆成(取值范围+量词)这样的组合
3、根据正则表达式规则翻译(取值范围+量词)
4、将翻译好的(取值范围+量词)组合进行拼接

参考文章:

1、JS正则表达式入门,看这篇就够了

四、易混淆点

在学习过程中把(?)相关的符号弄混了,
(?=)(?<=)(?!)(?<!)==》匹配位置
(?:)==>只分组而不捕获

(?)
参考文章:

1、正则表达式之捕获组和非捕获组
2、 javascript正则表达式---正向预查

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