JavaScript语言精粹 笔记05 正则表达式
正则表达式
正则表达式以方法的形式被用于对字符串中的信息进行查找、替换画图提取操作。可处理正则表达式的方法有:regexp.exec, regexp.test,string.match, string.replace, string.search, 和string.split。
结构
有两个方法来创建一个RegExp对象。优先方法是使用正则表达式字面量。正则表达式被包围在一对斜杠中。有3个标志能在RegExp中设置,分别为g、i、m。
// 构造一个匹配JavaScript字符串的正则表达式对象 var my_regexp = /"(?:\\.|[^\\\"])*"/g;
G:全局的(匹配多次;准确含有随方法而变)
I:大小写不敏感(忽略字符大小写)
M:多行(^和$能匹配行结束符)
创建正则表达式的另一个方法是使用RegExp构造器。这个构造器接收一个字符串,并把它编译为一个RegExp对象。第二个参数是一个指定标志的字符串。
// 构造一个匹配JavaScript字符串的正则表达式对象. var my_regexp = new RegExp("\"(?:\\\\.|[^\\\\\\\"])*\"", 'g');
RegExp对象的属性:
global:如果标志g被使用,值为true
ignoreCase:如果标记 i 被使用,值为true
lastIndex:下一次exec匹配开始的索引。初始值为0
multiline:如果标志 m 被使用,值为true
source:正则表达式源代码文本
用正则表达式字面量创建的RegExp对象来共享一个单实例:
function make_a_matcher() {
return /a/gi;
} var x = make_a_matcher();
var y = make_a_matcher(); //注意:x 和 y 是相同的对象 x.lastIndex = 10; document.writeln(y.lastIndex); //
元素
正则表达式选择
正则表达式选择包含1个或者多个表达式序列。这些序列被|(竖线)隔开。如果这些序列中的任何一项符合匹配条件,那么这个选择就被匹配。它尝试按顺序匹配这些序列项。
"into".match(/in|int/);
将在into中匹配in,但它不会匹配int,因为in已经匹配成功了。
正则表达式序列
一个正则表达式序列包含1个或者多个正则表达式因子.每个因子能够选择是否跟随一个量词,这个量词决定着这个因子被允许出现的次数。如果没有指定这个量词,那么该因子将被匹配一次。
正则表达式因子
一个正则表达式因子可以是一个字符、一个由圆括号包围的组、一个字符类,或者是一个转义序列。除了控制字符和特殊字符以外,所有的字符都将被按照字面处理。
\ / [ ] ( ) { } ? + * | . ^ $
如果你希望上面列出的字符按照字面去匹配,那么必须使用一个 \ 前缀来进行转义。当你存在疑虑时,可以给任何特殊字符都添加一个 \ 前缀使其字面化。 \ 前缀不能使字母或数字字面化。
一个未被转义的 . 将匹配除行结束符以外的任何字符。
当lastIndex的属性值为0时,一个未转义的^将匹配该文本的开始。当指定了 m 标识时,它也能匹配结束符。
一个未转义的$将匹配该文本的结束。当指定了 m 标识时,它也能匹配结束符。
正则表达式转义
\ 在正则表达式中表示转义。
\f 换页符
\n 换行符
\r 回车符
\t 制表符
\u 允许指定一个Unicode字符来表示一个十六进制的常量。
\d 等同于[0-9]
\D 等同于[^0-9]
\s 等同于[\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]
\S 等同于[^\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]
\w 等同于[0-9A-Z_a-z]
\W 等同于[^0-9A-Z_a-z]
\b 被指定为一个字边界标志,但是他使用\w 去寻找字边界,所以它对多数语言应用来说是完全无用的。
\1 是指向分组1所捕获到的文本的引用,所以它能够被再次匹配。例如:
var doubled_words = /([A-Za-z\u00C0-\u1FFF\u2800-\uFFFD]+)\s+\1/gi;
doubled_words将寻找连续的重复单纯(包含一个或多个字母的字符串),该单词后面跟着一个或多个空白,然后再跟着与它相同的单词。\2 是指向分组2所捕获到的文本的引用,\3 是指向分组3所捕获到的文本的引用,依此类推。
正则表达式分组
分组共有4种
捕获型
一个捕获型分组是一个被包围在括号中的正则表达式选择。任何匹配这个分组的字符将被捕获。每个捕获型分组都被指定了一个数字。正则表达式第一个捕获 ( 的是分组1,第二个捕获 ( 的是分组2。
非捕获型
非捕获型分组有一个(?:前缀。非捕获型分组仅做简单的匹配,并不会捕获所匹配的文本。这会有微弱的性能优势。非捕获型分组不会干扰捕获型分组的编号。
向前正相匹配
向前正向匹配分组有一个(?=前缀,它类似于非捕获型分组,但在这个组匹配后,文本将退回到它开始的地方,实际上并不匹配任何东西,这不是一个好的特性。
向前负向匹配
向前负向匹配分组有一个(?!前缀,它类似于向前正相匹配分组,但只有它匹配失败是它才进行匹配,这不是一个好的特性。
正则表达式类
正则表达式类是一种指定一组字符的便利方式。例如,匹配一个元音字母,可以写作(?:a|e|i|o|u),但它可以被方便地写成一个类[aeiou]。
一组有32个ASCII的特殊字符组成的集合:
! " # $ % & ' ( ) * +, - . / :; < = > ? @ [ \ ] ^ _ ` { | } ˜
可以被写为:
(?:!|"|#|\$|%|&|'|\(|\)|\*|\+|,|-|\.|\/|:|;|<|=|>|@|\[|\\|]|\^|_|` |\{|\||\}|˜)
也可以被写为:
[!-\/:-@\[-`{-˜]
它包括从 ! 到 / 、从 : 到 @ 、从 [ 到 ' 和从 { 到 ˜ 的字符。
另一种方便之处是类的求反。[^!-\/:-@\[-`{-˜] 匹配的是任何一个非ASCII特殊字符的字符。
正则表达式类转义
字符类内部转义规则和正则表达式因子相比稍有不同。[\b]是退格符。下面是在字符串类中需要被转义的特殊字符:
- / [ \ ] ^
正则表达式类量词
正则表达式因子可以用一个正则表达式量词后缀来决定这个因子应该匹配的次数。例如:
/www/等价于/w{3}/
{3,6}将匹配3,4,5或6次。
{3,}将匹配3次或更多次
?等价于{0,1}
*等价于{0,}
+等价于{1,}
如果只有一个量词,则趋于进行贪婪匹配,即匹配尽可能多的重复直到达到上限。如果这个量词还有一个额外的后缀?,那么趋向于懒惰匹配,即试图匹配尽可能少的必要重复。
参考:《JavaScript语言精粹》Douglas Crockford著 赵泽欣 鄢学鹍 译
转载请注明出处:
作者:JesseLZJ
出处:http://jesselzj.cnblogs.com
JavaScript语言精粹 笔记05 正则表达式的更多相关文章
- JavaScript语言精粹笔记
JavaScript语言精粹笔记 掌握语言的每个特性可以让你出风头,但是并不推荐,因为一部分的特性带来的麻烦可能远超本身的价值.正如书中所言,坏的材料并不能雕刻出好的作品,要成为一名更好的程序员,要取 ...
- JavaScript 语言精粹笔记3
方法 毒瘤 糟粕 记录一下阅读蝴蝶书的笔记,本篇为书中最后一部分:方法.代码风格.优美的特性.毒瘤.糟粕等. 方法 这一章主要介绍了一些方法集.这里写几个我不太熟悉的方法和要点吧. array.joi ...
- JavaScript语言精粹 笔记06 方法
JS包含了少量可用在标准类型上的标准方法. ArrayFunctionNumberObjectRegExpString Array array.concat(item...) concat方法返回一个 ...
- JavaScript语言精粹 笔记02 函数
函数函数对象函数字面量调用参数返回异常给类型增加方法递归作用域闭包回调模块级联套用记忆 函数 1 函数对象 在JS中函数就是对象.对象是“名/值”对的集合并拥有一个连接到原型对象的隐藏连接.对象字 ...
- JavaScript语言精粹 笔记01 语法 对象
内容比较简单,只是从头梳理一下JS的知识 语法空白标识符数字字符串语句 对象对象字面量检索更新引用原型反射枚举删除减少全局变量污染 语法 1 空白 空白可能表现为格式化字符或注释的形式.空白通常没有 ...
- JavaScript语言精粹 笔记04 数组
数组1 数组字面量2 长度3 删除4 列举5 混淆的地方6 方法7 维度 数组1 数组字面量 var empty = []; var numbers = [ 'zero', 'one', 'two', ...
- JavaScript语言精粹 笔记03 继承
继承伪类对象说明符原型函数化部件 继承 JS不是基于类的,而是基于原型的,这意味着对象直接从其他对象继承. 1 伪类 JS提供了一套丰富的代码重用模式,它可以模拟那些基于类的模式,因为JS实际上没有类 ...
- 1.javascript语言精粹笔记
一.注释 /**/ // 采用这个 二.标识符 标识符被用于语句.变量.参数.属性名.运算符和标记三.数字 javascript只有一个单一的数字模型.它在内部被表示64位的浮点数. 没有分离出整形, ...
- javascript语言精粹-笔记
walkDOM function walkTheDOM(node, func) { func(node); node = node.firstChild; while (node) { walkThe ...
随机推荐
- 对于Oracle中Number类型的字段映射成Java中的具体类型的问题
我在Oracle中给一个用户Id字段设置为Number类型,使用JDBC在完成ORM的时候,以为其可以自动转换为Integer,因为我的POJO类id使用的就是Integer.但事实是,我在测试的时候 ...
- Oracle block 格式
Oracle block 格式 信息参考: http://www.ixora.com.au/ 特别感谢 overtime 大哥对我的无私的帮助和对我一直鼓励支持我的网友这些资料是没得到oracle ...
- 28_java之mysql的CRUD
01数据库概念 * A: 什么是数据库 数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以对数据库中的数据进行增加,修改,删除及查询操作. * B: 什么是数据 ...
- Django学习---ajax
Ajax 应用场景:我们在输入表单进行提交的时候往往会判断输入的数据形式是否正确,这个时候如果我们点击了提交就会刷新页面.如果我们不想要它刷新页面,让它“悄悄的提交数据”,这个时候我们就需要使用aja ...
- 核主成分分析(Kernel Principal Component Analysis, KPCA)的公式推导过程
KPCA,中文名称”核主成分分析“,是对PCA算法的非线性扩展,言外之意,PCA是线性的,其对于非线性数据往往显得无能为力,例如,不同人之间的人脸图像,肯定存在非线性关系,自己做的基于ORL数据集的实 ...
- exited with code 1
brcc32 command line for "Project1.vrc" c:\program files\embarcadero\rad studio\9.0\bin\c ...
- Halcon标定
摄像头拍摄时候,图像均有畸变,但是图像的扭曲变形均是有规律的成线性的,所以可以通过算法矫正.halcon标定过程需要在镜头内放置标定板:标定板一般选用30*30mm的:可以通过halcon程序来制作: ...
- 【306】通过ArcPy编写ArcToolbox
参考:使用 Python 创建工具 参考:在 Python 工具箱中定义参数数据类型 基本步骤如下: (1)创建一个 Python 脚本,并保存成 .py 文件. (2)创建一个自定义工具箱(.tbx ...
- 【UVALive2965】Jurassic Remains
题意 题意给定n个大写字母组成的字符串,选择尽量多的串,使得每个大写字母都能出现偶数次.n<=24,每个字符串中每个字母最多出现一次. 分析 这是训练指南上的一道中途相遇法的简单题,但是好像也能 ...
- 待解决:2bootstrap-cerulean.css Failed to load resource: the server responded with a status of 404 ()
2bootstrap-cerulean.css Failed to load resource: the server responded with a status of 404 ()