JavaScript中的正则表达式学习笔记

  最近刚买了一本《JavaScript高级程序设计》,研究了一下第七章正则表达式,感觉到了正则表达式的强大和灵活性,一串字符的匹配模式往往有很多种,关键在于它的执行效率。这里留下一篇学习笔记,其中大部分内容摘自书本,相当于一次归纳总结,方便以后自己查阅。

1.1 RegExp对象的定义
  JavaScript对正则表达式的支持是通过ECMAScript中的RegExp类实现的,它的构造函数可以带一个或两个参数,第一个是模式字符串,第二个是匹配的额外参数。如:

var  str1  =   " Woody/nWoody/n1Woody23 " ;
var  str  =   new  RegExp( " Woody " " gim " );

  其中,g 表示全局搜索,i 表示忽略大小写,m 表示支持多行模式(如上面中的/n)。

1.2 RegExp对象的方法和属性
  1.test():判断某个字符串是否匹配指定的模式;
  2.exec():返回一个数组,数组中的第一个条目是第一个匹配,其他的是反向引用;
  3.match():返回一个包含在字符串中的所有匹配的数组;
  4.search():返回在字符串中出现的第一个匹配的位置;
  5.replace():用另一个字符串来替换某个字符串中的所有匹配;
  6.split():将字符串分割成一系列子串并通过一个数组将它们返回;

  7.global:表示g是否被设置;
  8.ignoreCase:表示i是否被设置;
  11.multiline:表示m是否被设置;
  9.lastIndex:代表下次匹配将会从哪个字符位置开始;
  10.source:正则表达式的源字符串形式;

  11.input:表示测试用的字符串;
  12.lastMatch:最后匹配的字符;
  13.lastParen:最后匹配的分组;
  14.leftContext:在上次匹配的前面的子串;
  15.rightContext:在上次匹配的后面的子串;
  16.multiline:指定是否所有的表达式都使用多行模式。

1.3 正则表达式的简单模式
1.3.1 元字符
  这里是正则表达式用到的所有的元字符:
   { [ { / ^ $ | ) ? * + .
  任何时候要在正则表达式中使用这些元字符,都必须对它们进行转义。
1.3.2 字符类

  简单类:就是明确知道要查找的字符,如:var re = /[abc]de]/gi;
  负向类:除了指定字符之外的字符,如:var re = /[^abc]de]/gi;
  范围类:指定某个范围的字符,如:var re = /[a-z]/gi;
  组合类:由上面几种类混合使用组成,如:var re = /[a-z1-4]/gi;
  预定义类:由正则表达式提供的几个简化的表达式,如:
    .:除了换行和回车之外的任意字符;
   /d:数字;
   /D:非数字字符;
   /s:空白字符;
   /S:非空白字符;
   /w:单词字符;
   /W:非单词字符。

1.4 量词
  指定某个特定模式出现的次数,包括硬性数量和软性数量。
1.4.1 简单量词
  ?:出现零次或一次;
  *:出现零次或多次;
  +:出现一次或多次;
  {n}:一定出现n次;
  {n,m}:至少出现n次但不超过m次;
  {n,}:至少出现n次;
1.4.2 贪婪的、惰性的和支配性的量词
  贪婪量词先看整个字符串是不是匹配,如果没有发现匹配,先去掉最后字符串中的最后一个字符,并再次尝试,如果还没有发现匹配,那么再次去掉最后一个字符,这个过程会一直重复下去直到发现匹配或不剩任何字符串,上面的简单量词都是贪婪量词。
  惰性量词先看字符串中的第一个字母是不是一个匹配,如果不匹配则继续读入下一个字符进行匹配,如果没有则一直匹配下去,与贪婪量词刚好相反,惰性量词用上面的简单量词跟一个?表示。
  支配量词只尝试匹配整个字符串,如果整个字符串不能匹配,不能进一步尝试。
  注意:IE和Opera不支持支配量词。

1.5 复杂模式
1.5.1 分组
  分组是通过用一系列括号包围一系列字符、字符类以及量词来使用的。如:
    var str = /(Woody)?/gi;
1.5.2 反向引用
  如果模式中使用了分组,通过匹配之后,每个分组都存放在一个特殊的地方以备将来使用,这些存储在分组中的特殊值,称之为反向引用,反向引用是按照从左到右遇到的左括号字符的顺序进行创建和编号的。如:(A?(B?))模式产生的反向引用为(A?(B?))、(B?);可以通过$1、$2引用这些值。
1.5.3 候选
  相当于OR,在指定的模式中只要有一个匹配就表示成功,用“|”分开各个模式。
1.5.4 非捕获性分组
  创建反向引用的分组,我们称之为捕获性分组,而非捕获性分组不会创建反向引用,这样不会影响匹配速度,如果要创建一个非捕获性分组,只要在左括号的后面加上一个问号和一个紧跟的冒号,如:

var  sTo  =   " #12345678 " ;
var  re  =   / #( ? :d + ) / ;
re.test( sTo );
alert( RegExp.$
1  );


1.5.5 前瞻
  运用前瞻可以告诉正则表达式运算器向前看一些字符而不移动其位置,包括正向前瞻和负向前瞻,正向前瞻检查的是接下来出现的是不是某个特定字符集,而负向前瞻则是检查接下来的不应该出现的特定字符集。创建正向前瞻要将模式放在(?=和)之间。创建负向前瞻要将模式放在(?!和)之间。
  注意:JavaScript只支持正则表达式的前瞻,而不支持后瞻。
1.5.6 边界
  ^:行开头;
  $:行结尾;
  /b:单词的边界;
  /B:非单词的边界;

  暂且就记录这么多了,以后慢慢更新,有好的匹配表达式也把它一起放上来,这里介绍一个工具,可以用来测试正则表达式,不过它是firefox的一个插件,需要firefox浏览器,在这里有介绍:https://addons.mozilla.org/firefox/2077/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值