码迷,mamicode.com
首页 > 编程语言 > 详细

javascript正则表达式

时间:2016-08-15 17:23:36      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

1.修饰符

  • g  :  global                   全文搜索,不添加,搜索到第一个匹配停止

  •  i  :  ignore case          忽略大小写,默认大小写敏感

  • m :     multiple lines       多行搜索   

 

2.元字符

  •  正则表达式由两种基本字符类型组成:

       -原义文本字符

       -元字符

  • 元字符是在正则表达式中由特殊含义的非字母字符

  • * + ? $ ^ . |  \ ( ) { } [ ]

    字符 含义
    \t 水平制表符
    \v 垂直制表符
    \n 换行符
    \r 回车符
    \0 空字符
    \f 换页符
    \cX 与X对应的控制字符(Ctrl + X)

3.字符类

  • 我们可以使用元字符[]来构建一个简单的类

  • 所谓类是指符合某些特性的对象,一个泛指,而不是特指某个字符

  • 表达式[abc]把字符 a 或 b 或 c 归为一类,表达式可以匹配这类的字符

4.字符类取反

  • 使用元字符 ^ 创建反向类/负向类

  • 反向类的意思是不属于某类的内容

  • 表达式[^abc]表示 不是字符a或b或c的内容

5.范围类

  • 使用[a-z]来连接两个字符表示从a到z 的任意字符

  • 这是个闭区间,也就是包含a和z本身

  • 在[]组成的类内部是可以连写的[a-zA-Z]

  1. >‘a1b2c3d4e5‘.replace(/[a-z]/g,‘Q‘)
  2. <"Q1Q2Q3Q4Q5"= $2
  3. >‘a1b2c3d4e5A1B2C3D4E5‘.replace(/[a-zA-Z]/g,‘Q‘)
  4. <"Q1Q2Q3Q4Q5Q1Q2Q3Q4Q5"= $3
  5. >‘2016-09-12‘.replace(/[0-9]/g,‘Q‘)
  6. <"QQQQ-QQ-QQ"= $4
  7. >‘2016-09-12‘.replace(/[0-9-]/g,‘Q‘)
  8. <"QQQQQQQQQQ"= $5

6.预定义类

 

字符 等价类 含义
 . [^\r\n] 除了回车符和换行符之外的所有字符
\d [0-9] 数字字符
\D [^0-9] 非数字字符
\s [\t\n\x0B\f\r] 空白符
\S [^\t\n\x0B\f\r] 非空白符
\w [a-zA-Z_0-9] 单词字符(字母、数字下划线)
\W [^a-zA-Z_0-9] 非单词字符
    • 匹配一个 ab+数字+任意字符 的字符串

      ab[0-9][^\r\n]    or     ab\d.

 

7.边界

  • 常用边界匹配字符

    字符 含义
    ^ 以xxx开始
    $ 以xxx结束
    \b 单词边界
    \B 非单词边界
    1. >‘@123@abc@‘.replace(/@./g,‘Q‘)
    2. <"Q23Qbc@"= $1
    3. >‘@123@abc@‘.replace(/^@./g,‘Q‘)
    4. <"Q23@abc@"= $2
    5. >‘@123@abc@‘.replace(/.@$/g,‘Q‘)
    6. <"@123@abQ"= $3

        技术分享

8.量词

字符 含义
出现零次或一次(最多出现一次)
出现一次或多次(至少出现一次)
出现零次或多次(任意次)
{n} 出现n次
{n,m} 出现n到m次
{n,} 至少出现n次

9.非贪婪模式

  • 让正则表达式尽可能少的匹配,也就是说一旦成功匹配不再继续尝试就是非贪婪模式

  • 做法很简单,在量词后加上?即可

  • ‘123456789‘.match(/\d{3,5}?/g)   ——>    {"123","456","789"}

10.分组

  • 使用()可以达到分组的功能,使量词作用于分组(Byron){3}

    1. >‘a1b2c3d4‘.replace(/[a-z]\d{3}/g,‘X‘)
    2. <"a1b2c3d4"= $1
    3. >‘a1b2c3d4‘.replace(/([a-z]\d){3}/g,‘X‘)
    4. <"Xd4"= $2
  • 使用 | 可以达到 或 的效果

    1. >‘ByronCasper‘.replace(/Byron|Casper/g,‘X‘)
    2. <"XX"= $1
    3. >‘ByronsperByrCasper‘.replace(/Byr(on|Ca)sper/g,‘X‘)
    4. <"XX"= $1
  • 反向引用

      2015-12-25 => 12/25/2015

     

    1. >  ‘2015-12-25‘.replace(/(\d{4})-(\d{2})-(\d{2})/g,‘$2/$3/$1‘)
    2. <"12/25/2015"= $1
  • 忽略分组  

    --不希望捕获某些分组,只需要在分组内加上?: 就可以  (?:Byron)

11.前瞻

  • 前瞻就是在正则表达式匹配到规则的时候,向前检查是否符合断言,后顾则相反。

    名称 正则 含义
    正向前瞻 exp(?=assert)  
    负向前瞻 exp(?!assert)  
    1. >‘a2*3‘.replace(/\w(?=\d)/g,‘X‘)
    2. <"X2*3"= $1
    3. >‘a2*34v8‘.replace(/\w(?=\d)/g,‘X‘)
    4. <"X2*X4X8"= $2
    5. >‘a2*34vv‘.replace(/\w(?=\d)/g,‘X‘)
    6. <"X2*X4vv"= $3
    7. >‘a2*34vv‘.replace(/\w(?!\d)/g,‘X‘)
    8. <"aX*3XXX"= $5

12.对象属性

  • global                     是否全文搜索,默认false

  • ignore case           是否大小写敏感,默认使false

  • multiple lines         多行搜索,默认值使false

  • lastIndex                是当前表达式匹配内容的最后一个字符的下一个位置

  • source                   正则表达式的文本字符串

 
 
13.test方法和exec方法
  • RegExp.prototype.test(str)
           用于测试字符串参数中是否存在匹配正则表达式模式的字符串
           如果存在则返回true,否则返回false
  • RegExp.prototype.exec(str)
    •  适用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性以反映匹配结果
    •  如果没有匹配的文本则返回null,否则返回一个结果数组:
      •    index  声明匹配文本的第一个字符的位置
      •    input   存放被检索的字符串string    
    •  非全局调用

 

      1. 调用非全局的RegExp对象的exec时,返回数组
      2. 第一个元素是与正则表达式相匹配的文本
      3. 第二个元素是与RegExp对象的第一个子表达式相匹配的文本(如果有的话)
      4. 第三个元素是与RegExp对象的第二个子表达式相匹配的文本(如果有的话),以此类推
    1. var reg =/\d(\w)(\w)\d/;
    2. var reg2 =/\d(\w)(\w)\d/g;
    3. var ts =‘$1az2bb3cy4dd5ee‘;
    4. var ret = reg.exec(ts)
    5. while(ret = reg2.exec(ts)){
    6. console.log(reg2.lastIndex +‘\t‘+ ret.index +‘\t‘+ ret.toString());
    7. };
    8. //1511az2,a,z
    9. //11173cy4,c,y
    1. var reg =/\d(\w)(\w)\d/;
    2. var reg2 =/\d(\w)\d/g;
    3. var ts =‘$1az2bb3cy4dd5ee‘;
    4. var ret = reg.exec(ts)
    5. console.log(reg.lastIndex +‘\t‘+ ret.index +‘\t‘+ ret.toString());
    6. console.log(reg.lastIndex +‘\t‘+ ret.index +‘\t‘+ ret.toString());
     
14.常用字符串对象方法
  • String.prototype.search(reg)
    • search()方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串
    • 方法返回第一个匹配结果index,查找不到返回-1
    • search()方法不执行全局匹配,它将忽略标志g,并且总是从字符串的开始进行检索
  • String.prototype.match(reg)
    • match()方法将检索字符串,以找到一个或多个与regexp匹配的文本     
    • regexp是否具有标志g对结果影响很大
    • 非全局调用
      • 如果regexp没有标志g,那么match()方法就只能在字符串中执行一次匹配
      • 如果没有找到任何匹配的文本,将返回null
      • 否则它将返回一个数组,其中存放了与它找到的匹配文本有关的信息
      • 返回数组的第一个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本
      • 除了常规的数组元素之外,返回的数组还含有2个对象属性
        • index声明匹配文本的起始字符在字符串的位置
        • input声明对stringObject的引用
    • 全局调用
      • 如果regexp具有标志g则match()方法将执行全局检索,找到字符串中所有的匹配子字符串
        • 没有找到任何匹配的子字符串,则返回null
        • 如果找到了一个或多个匹配子字符串,则返回一个数组
          • 数组元素中存放的是字符串中所有的匹配子字符串,而且也没有index属性或input属性
      1. var reg =/\d(\w)\d/;
      2. var reg2 =/\d(\w)\d/g;
      3. var ts =‘$1a2b3c4d5e‘;
      4. var ret = ts.match(reg);
      5. console.log(ret);
      6. console.log(ret.index +‘\t‘+ reg.lastIndex);
      7. ["1a2","a", index:1, input:"$1a2b3c4d5e"]0:"1a2"1:"a"index:1input:"$1a2b3c4d5e"length:2__proto__:Array[0]
      8. 10
       
  • String.prototype.split(reg)
    • 我们经常适用split方法把字符串分割为字符数组
      1. ‘a,b,c,d‘.split(‘,‘);//["a","b","c","d"]
    • 在一些复杂的分割情况下我们可以使用正则表达式解决
      1. ‘a1b2c3d‘.split(/\d/);//["a","b","c","d"]
       
  • String.prototype.replace
    1. String.prototype.replace(str,replaceStr)
    2. String.prototype.replace(reg,replaceStr)
    3. String.prototype.replace(reg,function)
        function 会在每次匹配替换的时候调用,有四个参数
      1. 匹配字符串
      2. 正则表达式分组内容,没有分组则没有该参数
      3. 匹配项在字符串中的index
      4. 原字符串
        
  1. ‘a1b2c3d4e5‘.replace(/\d/g,function(match,index,origin){
  2. console.log(index);
  3. return parseInt(match)+1;
  4. });
  5. VM358:11
  6. VM358:13
  7. VM358:15
  8. VM358:17
  9. VM358:19
  10. "a2b3c4d5e6"
  1. ‘a1b2c3d4e5‘.replace(/(\d)(\w)(\d)/g,function(match,group1,group2,group3,index,origin){
  2. console.log(match);
  3. return group1 + group3;
  4. });
  5. VM405:11b2
  6. VM405:13d4
  7. "a12c34e5"
 

 





javascript正则表达式

标签:

原文地址:http://www.cnblogs.com/gdeng338/p/5773591.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!