JavaScript语言精粹读书笔记- 正则表达式

[b]正则表达式[/b]:
JavaScript的许多特性都借鉴自其他语言。[color=red]语法借鉴自Java,函数借鉴自Scheme,原型继承借鉴自Self,正则表达式借鉴自Perl[/color]。
正则表达式是一门简单语言的语法规范。它以方法的形式被用于对字符串中的信息进行[color=red]查找、替换和提取[/color]操作。可处理正则表达式的方法有regexp.exec、regexp.test、string.match、string.replace、string.search和string.split。通常来说,在JavaScript中正则表达式相较于等效的字符串运算有着显著的性能优势。

[b]一个例子An Example[/b]:
[color=red](?:…)表示一个非捕获型分组(noncapturing group)[/color]。
[color=red](….)标识一个捕获型分组(capturing group)[/color]。一个捕获型分组将复制它所匹配的文本,并将其放入result数组中。每个捕获型分组都将被指定一个编号。[color=red]第一个捕获型分组的编号是1[/color]。
[color=red][…]标识一个字符串类[/color]。

[b]结构Construction[/b]:
有两个方法来创建一个RegExp对象:[color=red]RegExp构造器和正则表达式字面量[/color]。优先使用的方法是正则表达式字面量。
[color=red]正则表达式字面量被包围在一对斜杠中[/color]。这有点令人难以捉摸,因为斜杠也被用作除法运算符和注释符。
有3个标志能在RegExp中设置。它们分别由字母g、i和m来标识。这些标志被直接添加在RegExp字面量的末尾。
G:全局的(匹配多次;准确含义随方法而变)
I:大小写不敏感(忽略字符大小写)
M:多行(^和$能匹配行结束符)

RegExp构造器:第一个参数是被编译成正则表达式的字符串(双写反斜杠转义),第二个参数是一个指定标志的字符串。
[color=red]RegExp构造器适用于正则表达式必须在运行时动态生成的情景[/color]。
RegExp对象的属性:
global,ignoreCase,multiline,lastIndex:下一次exec匹配开始的索引、初始值为0,source:正则表达式源代码文本

[color=red]正则表达式字面量创建的RegExp对象是共享一个单实例[/color]:
function make_a_matcher(){return /a/ig;};
var x = make_a_matcher();
var y = make_a_matcher();
// [color=red]注意:x和y是相同的对象![/color]
x.lastIndex = 10;
document.writeln(y.lastIndex); // 10

[b]元素[/b]:
[b]正则表达式选择[/b]:
一个正则表达式选择包括一个或者多个正则表达式序列。这些序列被|(竖线)字符分隔。如果这些序列中的任何一项符合匹配条件,那么这个选择就被匹配。它尝试按顺序依次匹配这些序列。所以:”into”.match(/in|int/)将在into中匹配in。但它不会匹配int,因为in已被匹配成功了。
[b]正则表达式序列[/b]:
一个正则表达式序列包含一个或者多个正则表达式因子。每个因子能选择是否跟随一个量词,这个量词决定着这个因子被允许出现的次数。如果没有指定这个量词,那么该因子将被匹配一次。

[b]正则表达式因子[/b]:
一个正则表达式因子可以是一个字符、一个由圆括号包围的组、一个字符类,或者是一个转义序列。除了控制字符和特殊字符外,所有的字符都将被按照字面处理:\/[ ](){}?+*|.^$
如果你希望上面列出的字符按字面去匹配,那么必须要用一个 \ 前缀来进行转义。当你存在疑虑时,可以给任何特殊字符加一个 \ 前缀来使其字面化。\ 前缀不能使字母或数字字面化。
一个未被转义的 . 将匹配除行结束符以外的任何字符。
当lastIndex属性值为0时,一个未转义的 ^ 将匹配该文本的开始。当指定了m标识时,它也能匹配行结束符。一个未转义的 $ 将匹配该文本的结束。当指定了m标志时,它也能匹配行结束符。
[b]正则表达式转义[/b]:
[b]正则表达式分组[/b]:
分组共有4组。
[color=red]捕获型:一个捕获型分组是一个被包围在括号中的正则表达式选择[/color]。任何匹配这个分组的字符都将被捕获。每个捕获分组都将被指定了一个数字。在正则表达式中第一个捕获(的分组是1。第二个捕获(的分组是2。
[color=red]非捕获型:分捕获型分组有一个(?:前缀。非捕获型分组仅做简单的匹配[/color];并不会捕获所匹配的文本。这会有微弱的性能优势。非捕获型分组不会干扰捕获型分组的编号。
[color=red]向前正向匹配(Positive lookahead)[/color]:向前正向匹配组有一个(?=前缀。它类似与非捕获型分组,但这个组匹配后,文本将倒回到它开始的地方,实际上并不匹配任何东西。这不是一个好特性。
[color=red]向前负向匹配(Negative lookahead)[/color]:向前负向匹配组有一个(?!前缀。它类似于向前正向匹配,但只有当它匹配失败时它才进行匹配。这不是一个好的特性。

[b]正则表达式类Regexp Class[/b]:[color=red]正则表达式类是一种指定一组字符的便利方式[/color]。例如,如果想匹配一个元音字母,我们可以写作(?:a|e|i|o|u),但它可以被更方便地写成一个类[aeiou]。类提供了两个方便特性:指定字符范围和类的求反。

[b]正则表达式类转义[/b]:
[b]正则表达式量词Regexp Quantifier[/b]:
?:{0,1};*:{0,};+:{1,}
[color=red]如果只有一个量词,则趋向于进行贪婪性匹配[/color],即匹配尽可能多的重复直至达到上限。[color=red]如果这个量词后面还有一个额外的后缀?,那么则趋向于进行懒惰性匹配[/color],即试图匹配尽可能少的必要重复。一般情况下最好坚持使用贪婪性匹配。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值