正则表达式浅略学习

在javascript编程中,会时常用到正则表达式。因此,决定对正则表达式进行学习。

学习的目的主要是能够在编程中使用到它,因此,不要求精通,只需对其基本知识有所了解即可。学习材料主要来自正则表达式30分钟入门教程,作者deerchao。

从目录及速览全文后,我认为,对正则表达式的基本了解应该主要从字符、限定符、规则、语法这四方面进行归纳。通过限定符和元字符配合使用来确定匹配字符的次数,通过设定并遵守一些规则来达到更多的匹配方式,最后进阶使用语法来达到最高层的正则表达式匹配。

1.字符:正则表达式中的字符分为原意文本字符和元字符。确定的英文字母和数字在正则表达式中可以用其本身表示(愿意文本字符),而元字符是一些具有特殊意义的正则表达式特殊代码,常用的元字符有下:

  • . 匹配除换行符以外的任意字符;
  • \w 匹配字母或数字或下划线或汉字;
  • \s 匹配任意的空白符;
  • \d 匹配数字;
  • \b 匹配字符串开始或结束;
  • ^ 匹配字符串开始;
  • $ 匹配字符串的结束;

举个例子,\b\d6\d\b表示的是匹配首字符为任意数字、中间字符为6、尾字符为任意数字的一个字符串,而\d6\d$同样也是匹配的这样一个字符串。由元字符会衍生出一个问题:元字符中有一些如.等是用特殊符号来表示的,那么在正则表达式中用什么来匹配它们自己呢?这就引出了转义的规则:在这些特殊符号前面使用“\”对其进行转义,就可以匹配它们自身了。那么“\”又用什么来匹配呢?还是用它自己进行转义:正则表达式中的“\”就是用来匹配“\”的。

2.限定符:有了字符并不能解决问题,比如,如果想要匹配一个12位长的任意数字,难道要使用“\d”12次,那位数再多一些怎么办呢?
于是限定符就起作用了。我的理解,限定符就是规定正则表达式中一个字符或一段字符要匹配的次数,如下,是一些常用的限定符:

  • * 重复零次或更多次;
  • + 重复一次或更多次;
  • ? 重复零次或一次;
  • {n,} 重复n次或更多次;
  • {n,m} 重复n到m次;
  • {n} 重复n次;
  • *? 重复任意次,但尽可能少重复;
  • +? 重复1次或更多次,但尽可能少重复;
  • ?? 重复0次或1次,但尽可能少重复;
  • {n,m}? 重复n到m次,但尽可能少重复;
  • {n,}? 重复n次以上,但尽可能少重复;

于是,要匹配12位长的数字,只需“\d{12}”这样写就行了。从上面可以明显的看出,前五个和后五个以中间第六个为界限,可以归纳为两大类,前五个叫做贪婪匹配,后五个叫做懒惰匹配(为什么用两个贬义词来定义,一脸懵逼??)。

3.规则:有了字符和限定符还并不能解决问题,还缺少一些规则,这些规则使我们能够更便捷的使用正则表达式。比较常用的规则有:字符类、反义、分支条件、分组、和向后引用。以下一一解释:

字符类:如果只想匹配某几个确定的字母或数字,就需要使用到字符类。举个例子,如果我只想匹配一段字符串中是否有a、b、c这三个字母,那么只需“[abc]”这样表示就可以进行匹配了,而这正是一个字符类。

反义:有时候,我们需要的结果是不想字符串中有某个字符或是某段字符(既匹配不含这些字符的字符串),就需要用到反义规则了,常见的反义规则代码有下:

  • \W 匹配任意不是字母,数字,下划线,汉字的字符;
  • \S 匹配任意不是空白符的字符;
  • \D 匹配任意非数字的字符;
  • \B 匹配不是单词开头或结束的位置;
  • [^x] 匹配除了x以外的任意字符;
  • [^aeiou] 匹配除了aeiou这几个字母以外的任意字符;

分支条件:指的是有几种匹配方式,如果满足其中任意一种匹配方式都应该当成匹配。而分支条件的具体方法是把不同的匹配方式用|隔开。举个例子,0\d{2}-\d{8}|0\d{3}-\d{7}这个正则表达式指的是只要某段字符串能够满足0xx-xxxxxxxx或者0xxx-xxxxxxx两种形式中的任意一种(x代表数字),就可以被匹配。而分支条件需要遵守另外一条规则:正则表达式的匹配都是从左到右进行匹配,如果字符串满足了前面的匹配方式,就被前面匹配了,既使它(或者它内部某段字符串,亦或它加上前后某段字符串)能够满足后面的匹配方式,也不会再次被后面匹配。

分组:分组的规则主要是为了满足一些语法或是规则,具体方法是使用小括号将某段正则表达式包围起来,既对其进行了分组,在默认情况下,如果一段正则表达式中有几个组,那么他们的组号是从左至右从1开始依次增大的。\b(\w+)\d(\w+)\b这段正则表达式里,第一个(\w+)的组号为1,第二个(\w+)的组号为2。

而依赖分组规则,后向引用就起到了很大的作用。如:有这样一段表达式,\b(\w+)\b\s+(\w+)\b,从中可见,第一个括号的内容与第二个完全相同,此时,完全可以利用后项引用规则,用第一个组的组号来替代第二个组:\b(\w+)\b\s+\1\b。需要注意的是,利用组号来引用,一定要加上转义符,如“\1”。

4.语法:常用的语法也主要依赖于分组,如下:

  • (exp) 匹配exp,并捕获文本到自动命名的组里;
  • (?<name>exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp);
  • (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号;
  • (?=exp) 匹配exp前面的位置;
  • (?<=exp) 匹配exp后面的位置;
  • (?!exp) 匹配后面跟的不是exp的位置;
  • (?<!exp) 匹配前面不是exp的位置;
  • (?#comment) 这种类型的分组不对正则表达式的处理产生任何影响,用于提供注释让人阅读;

以上,前三个属于捕获,其后四个属于零宽断言,最后一个是注释。需要注意的是零宽断言,为什么叫零宽?因为它匹配的是一个位置,并不是字符;而断言指的是这个位置需要满足一定的条件。

以上就是正则表达式的大半基础知识了,除此之外,还有处理选项、平衡组(递归匹配)等需要了解。对于一些常规的js编程如表单验证等,利用上面的知识就足够了。

但是,只利用正则表达式来匹配字符串并不能完全解决问题,比如有时需要计算字符串的字节长度,而字符串中含有汉字的情况下,需要将汉字进行转码,形成unicode编码,再对编码用“\”来转义,才能正确匹配找到汉字,并计算字节数。

Small Star's Blog|小星的博客

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

推荐阅读更多精彩内容