#正则表达式

引言亲爱的读者朋友,如果你点开了这篇文章,说明你对正则很感兴趣。 想必你也了解正则的重要性,在我看来正则表达式是衡量程序员水平的一个侧面标准。 关于正则表达式的教程,网上也有很多,相信你也看了一些。 与之不同的是,本文的目的是希望所有认真读完的童鞋们,都有实质性的提高。 本文内容共有七章,用JavaScript语言完整地讨论了正则表达式的方方面面。 如果觉得文章某块儿没有说明白清楚,欢迎留言,能力范围之内,老姚必做详细解答。 具体章节如下: 引言 第一章 正则表达式字符匹配攻略 第二章 正则表达式位置匹配攻略 第三章 正则表达式括号的作用 第四章 正则表达式回溯法原理 第五章 正则表达式的拆分 第六章 正则表达式的构建 第七章 正则表达式编程 后记 下面简单地说说每一章都讨论了什么? 正则是匹配模式,要么匹配字符,要么匹配位置。 第1章和第2章以这个角度去讲解了正则的基础。 在正...

第七章 正则表达式编程什么叫知识,能指导我们实践的东西才叫知识。 学习一样东西,如果不能使用,最多只能算作纸上谈兵。正则表达式的学习,也不例外。 掌握了正则表达式的语法后,下一步,也是关键的一步,就是在真实世界中使用它。 那么如何使用正则表达式呢?有哪些关键的点呢?本章就解决这个问题。 内容包括: 正则表达式的四种操作 相关API注意要点 真实案例 1. 正则表达式的四种操作正则表达式是匹配模式,不管如何使用正则表达式,万变不离其宗,都需要先“匹配”。 有了匹配这一基本操作后,才有其他的操作:验证、切分、提取、替换。 进行任何相关操作,也需要宿主引擎相关API的配合使用。当然,在JS中,相关API也不多。 1.1 验证 验证是正则表达式最直接的应用,比如表单验证。 在说验证之前,先要说清楚匹配是什么概念。 所谓匹配,就是看目标字符串里是否有满足匹配的子串。因此,“匹配”的本质就是...

第六章 正则表达式的构建对于一门语言的掌握程度怎么样,可以有两个角度来衡量:读和写。 不仅要看懂别人的解决方案,也要能独立地解决问题。代码是这样,正则表达式也是这样。 与“读”相比,“写”往往更为重要,这个道理是不言而喻的。 对正则的运用,首重就是:如何针对问题,构建一个合适的正则表达式? 本章就解决该问题,内容包括: 平衡法则 构建正则前提 准确性 效率 1. 平衡法则构建正则有一点非常重要,需要做到下面几点的平衡: 匹配预期的字符串 不匹配非预期的字符串 可读性和可维护性 效率 2. 构建正则前提2.1 是否能使用正则 正则太强大了,以至于我们随便遇到一个操作字符串问题时,都会下意识地去想,用正则该怎么做。但我们始终要提醒自己,正则虽然强大,但不是万能的,很多看似很简单的事情,还是做不到的。 比如匹配这样的字符串:1010010001…. 虽然很有规律,但是只靠正则就是无...

第五章 正则表达式的拆分对于一门语言的掌握程度怎么样,可以有两个角度来衡量:读和写。 不仅要求自己能解决问题,还要看懂别人的解决方案。代码是这样,正则表达式也是这样。 正则这门语言跟其他语言有一点不同,它通常就是一大堆字符,而没有所谓“语句”的概念。 如何能正确地把一大串正则拆分成一块一块的,成为了破解“天书”的关键。 本章就解决这一问题,内容包括: 结构和操作符 注意要点 案例分析 1. 结构和操作符编程语言一般都有操作符。只要有操作符,就会出现一个问题。当一大堆操作在一起时,先操作谁,又后操作谁呢?为了不产生歧义,就需要语言本身定义好操作顺序,即所谓的优先级。 而在正则表达式中,操作符都体现在结构中,即由特殊字符和普通字符所代表的一个个特殊整体。 JS正则表达式中,都有哪些结构呢? 字符字面量、字符组、量词、锚字符、分组、选择分支、反向引用。 具体含义简要回顾如下(如懂,...

第四章 正则表达式回溯法原理学习正则表达式,是需要懂点儿匹配原理的。 而研究匹配原理时,有两个字出现的频率比较高:“回溯”。 听起来挺高大上,确实还有很多人对此不明不白的。 因此,本章就简单扼要地说清楚回溯到底是什么东西。 内容包括: 没有回溯的匹配 有回溯的匹配 常见的回溯形式 1. 没有回溯的匹配假设我们的正则是/ab{1,3}c/,其可视化形式是: 而当目标字符串是”abbbc”时,就没有所谓的“回溯”。其匹配过程是: 其中子表达式b{1,3}表示“b”字符连续出现1到3次。 2. 有回溯的匹配如果目标字符串是”abbc”,中间就有回溯。 图中第5步有红颜色,表示匹配不成功。此时b{1,3}已经匹配到了2个字符“b”,准备尝试第三个时,结果发现接下来的字符是“c”。那么就认为b{1,3}就已经匹配完毕。然后状态又回到之前的状态(即第6步,与第4步一样),最后再用子表达...

第三章 正则表达式括号的作用不管哪门语言中都有括号。正则表达式也是一门语言,而括号的存在使这门语言更为强大。 对括号的使用是否得心应手,是衡量对正则的掌握水平的一个侧面标准。 括号的作用,其实三言两语就能说明白,括号提供了分组,便于我们引用它。 引用某个分组,会有两种情形:在JavaScript里引用它,在正则表达式里引用它。 本章内容虽相对简单,但我也要写长点。 内容包括: 分组和分支结构 捕获分组 反向引用 非捕获分组 相关案例 1. 分组和分支结构这二者是括号最直觉的作用,也是最原始的功能。 1.1 分组 我们知道/a+/匹配连续出现的“a”,而要匹配连续出现的“ab”时,需要使用/(ab)+/。 其中括号是提供分组功能,使量词+作用于“ab”这个整体,测试如下: var regex = /(ab)+/g;var string = "ababa abbb ababab";c...

第二章 正则表达式位置匹配攻略正则表达式是匹配模式,要么匹配字符,要么匹配位置。请记住这句话。 然而大部分人学习正则时,对于匹配位置的重视程度没有那么高。 本章讲讲正则匹配位置的总总。 内容包括: 什么是位置? 如何匹配位置? 位置的特性 几个应用实例分析 1. 什么是位置呢?位置是相邻字符之间的位置。比如,下图中箭头所指的地方: 2. 如何匹配位置呢?在ES5中,共有6个锚字符: **^** **$** **\b** **\B** **(?=p)** **(?!p)** 2.1 ^和$ ^(脱字符)匹配开头,在多行匹配中匹配行开头。 $(美元符号)匹配结尾,在多行匹配中匹配行结尾。 比如我们把字符串的开头和结尾用”#”替换(位置可以替换成字符的!): var result = "hello".replace(/^|$/g, '#');console.log(result)...

第一章 正则表达式字符匹配攻略正则表达式是匹配模式,要么匹配字符,要么匹配位置。请记住这句话。 然而关于正则如何匹配字符的学习,大部分人都觉得这块比较杂乱。 毕竟元字符太多了,看起来没有系统性,不好记。本章就解决这个问题。 内容包括: 两种模糊匹配 字符组 量词 分支结构 案例分析 1. 两种模糊匹配如果正则只有精确匹配是没多大意义的,比如/hello/,也只能匹配字符串中的”hello”这个子串。 var regex = /hello/;console.log( regex.test("hello") ); // => true 正则表达式之所以强大,是因为其能实现模糊匹配。 而模糊匹配,有两个方向上的“模糊”:横向模糊和纵向模糊。 1.1 横向模糊匹配 横向模糊指的是,一个正则可匹配的字符串的长度不是固定的,可以是多种情况的。 其实现的方式是使用量词。譬如{m,n},表...