zoukankan      html  css  js  c++  java
  • javascript正则表达式

    参考:http://www.cnblogs.com/xiaohuochai/p/5608807.html#anchor7  写的不错  如有冒犯,请留言

    /*正则表达式是描述字符模式的对象。
    正则表达式用于对字符串模式匹配及检索替换,是对字符串执行模式匹配的强大工具*/

    /*语法
     var patt=new RegExp(pattern,modifiers);
     或者更简单的方式:
    var patt=/pattern/modifiers;
     modifiers 取值如下:
     i 执行对大小写不敏感的匹配。
     g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
     m 执行多行匹配。 
     例如:
    var patt = /AaAA/i;
    alert(patt.test("aaaa")) ;  结果为true
    var patt2 = /AaAA/;
    alert(patt2.test("aaaa")) ;  结果为false
     */
    /*大部分字符在正则表达式中,就是字面的含义,比如/a/匹配a,/b/匹配b
    但还有一些字符,它们除了字面意思外,还有着特殊的含义,这些字符就是元字符
    在javascript中,共有14个元字符(meta-character)
    () [] {}  ^ $ | ? * + .
     元字符         名称              匹配对象
     .             点号              单个任意字符(除回车
    、换行
    、行分隔符u2028和段分隔符u2029外)
     []            字符组             列出的单个任意字符
     [^]           排除型字符组        未列出的单个任意字符
     ?             问号               匹配0次或1次
     *             星号               匹配0交或多次
     +             加号               匹配1次或多次
     {min,max}     区间量词           匹配至少min次,最多max次
     ^             脱字符             行的起始位置
     $             美元符             行的结束位置
     |             竖线               分隔两边的任意一个表达式
     ()            括号               限制多选结构的范围,标注量词作用的元素,为反向引用捕获文本
     1,2...      反向引用            匹配之前的第一、第二...组括号内的表达式匹配的文本
    
    转义字符:
    因为元字符有特殊的含义,所以无法直接匹配。如果要匹配它们本身,则需要在它们前面加上反斜杠()
    例如现在我们要匹配字符串"1+1",
    console.log(/1+1/.test("1+1")); 输出为false
    console.log(/1+1/.test("1+1"));输出结果为true
    如果用var patt=new RegExp(pattern,modifiers);方法
    var patt = new RegExp("1\+1"); 要进行两次转义。的转义为\
    console.log(patt.test("1+1"));  输出结果为true
    字符组:简单而言,就是指用方括号表示的一组字符,它匹配若干字符之一
    例如:
    var p = /[0123456789]/;
    console.log(p.test("12")) ;输出为true
    console.log(p.test("a"));   输出为false
    [注意]字符组中的字符排列顺序并不影响字符组的功能,出现重复字符也不会影响
     /[0123456789]/
       等价于
      /[9876543210]/
        等价于
      /[1234567890123456789]/ 
    范围
    正则表达式通过连字符(-)提供了范围表示法,可以简化字符组
     /[0123456789]/
     等价于
     /[0-9]/
     /[abcdefghijklmnopqrstuvwxyz]/
     等价于
     /[a-z]/
     所以[0-9]是合法的,而[9-0]会报错
     /[0-9a-zA-Z]/;//匹配数字、大写字母和小写字母
     //匹配中划线
     console.log(/-/.test('-'));//true
     console.log(/[-]/.test('-'));//true
    
    用[0-9]、[a-z]等字符组,可以很方便地表示数字字符和小写字母字符。对于这类常用字符组,正则表达式提供了更简单的记法,这就是字符组简记(shorthands)
    常见的字符组简记有d、w、s。其中d表示(digit)数字,w表示(word)单词,s表示(space)空白
    正则表达式也提供了对应排除型字符组的简记法:D、W、S。字母完全相同,只是改为大写,这些简记法匹配的字符互补
    w不仅包括字母、数字,还包括下划线。在进行数字验证时,只允许输入字母和数字时,不可以使用w,而应该使用[0-9a-zA-Z]
    任意字符
      人们一般认为点号可以代表任意字符,其实并不是
      .点号代表除回车( )、换行( ) 、行分隔符(u2028)和段分隔符(u2029)以外的任意字符
      妥善的利用互补属性,可以得到一些巧妙的效果。比如,[sS]、[wW]、[dD]都可以表示任意字符
    量词
         量词	    描述
         n+	        匹配任何包含至少一个 n 的字符串。
         n*	        匹配任何包含零个或多个 n 的字符串。
         n?	        匹配任何包含零个或一个 n 的字符串。
         n{X}	    匹配包含 X 个 n 的序列的字符串。
         n{X,Y}	    匹配包含 X 或 Y 个 n 的序列的字符串。
         n{X,}	    匹配包含至少 X 个 n 的序列的字符串。
         n$	        匹配任何结尾为 n 的字符串。
         ^n	        匹配任何开头为 n 的字符串。
         ?=n	    匹配任何其后紧接指定字符串 n 的字符串。
         ?!n	    匹配任何其后没有紧接指定字符串 n 的字符串。
    

      

     注意
         var p = /^a/;             匹配以a开头的
         console.log(p.test("asdf"));    结果为ture
         var p2 = /[^a]/;           匹配未列出的
         console.log(p2.test("a"));      结果为false
    协议名有http和https两种
    /https?/; 匹配http 和 https
    RegExp 对象方法
         方法	    描述
         compile	编译正则表达式。
         exec	    检索字符串中指定的值。返回找到的值,并确定其位置。
         test	    检索字符串中指定的值。返回 true 或 false。
    括号
      括号有两个功能,分别是分组和引用。具体而言,是用于限定量词或选择项的作用范围,用于捕获文本并可以进行引用或反向引用
    分组
      量词控制之前元素的出现次数,而这个元素可能是一个字符,也可能是一个字符组,也可以是一个表达式
      如果把一个表达式用括号包围起来,这个元素就是括号里的表达式,被称为子表达式
      如果希望字符串'ab'重复出现2次,应该写为(ab){2},而如果写为ab{2},则{2}只限定b
    console.log(/(ab){2}/.test('abab'));//true
    console.log(/(ab){2}/.test('abb'));//false
    console.log(/ab{2}/.test('abab'));//false
    console.log(/ab{2}/.test('abb'));//true 
    身份证长度有15位和18位两种,如果只匹配长度,可能会想当然地写成d{15,18},实际上这是错误的,因为它包括15、16、17、18这四种长度。因此,正确的写法应该是d{15}(d{3})?
    捕获
      括号不仅可以对元素进行分组,还会保存每个分组匹配的文本,等到匹配完成后,引用捕获的内容。因为捕获了文本,这种功能叫捕获分组
    比如,要匹配诸如2017-01-19这样的日期字符串
    /(d{4})-(d{2})-(d{2})/
    javascript有9个用于存储捕获组的构造函数属性
    RegExp.$1, RegExp.$2, RegExp.$3……到RegExp.$9分别用于存储第一、第二……第九个匹配的捕获组。在调用exec()或test()方法时,这些属性会被自动填充
    var p = /(d{4})-(d{2})-(d{2})/;
    var group = '2017-01-19'.match(p);
    console.log(group[0]);   //2017-01-19
    console.log(group[1]);     //2017
    console.log(group[2]);      //01
    console.log(group[3]);      //19
    
    console.log(RegExp.$1);//'2017'        通过RegExp.$n   取值
    console.log(RegExp.$2);//'01'
    console.log(RegExp.$3);//'19'
    console.log(RegExp.$4);//''
    上面的示例在获取一个字符串的的一段特定值时非常有效

    非捕获
    除了捕获分组,正则表达式还提供了非捕获分组(non-capturing group),以(?:)的形式表示,它只用于限定作用范围,而不捕获任何文本
    比如,要匹配abcabc这个字符,一般地,可以写为(abc){2},但由于并不需要捕获文本,只是限定了量词的作用范围,所以应该写为(?:abc){2}
    console.log(/(abc){2}/.test('abcabc'));//true
    console.log(/(?:abc){2}/.test('abcabc'));//true
    由于非捕获分组不捕获文本,对应地,也就没有捕获组编号
    console.log(/(abc){2}/.test('abcabc'));//true
    console.log(RegExp.$1);//'abc'
    console.log(/(?:abc){2}/.test('abcabc'));//true
    console.log(RegExp.$1);//''
    选择
    竖线'|'在正则表达式中表示或(OR)关系的选择,以竖线'|'分隔开的多个子表达式也叫选择分支或选择项。在一个选择结构中,选择分支的数目没有限制
    在选择结构中,竖线|用来分隔选择项,而括号()用来规定整个选择结构的范围。如果没有出现括号,则将整个表达式视为一个选择结构
    选择项的尝试匹配次序是从左到右,直到发现了匹配项,如果某个选择项匹配就忽略右侧其他选择项,如果所有子选择项都不匹配,则整个选择结构匹配失败
    console.log(/12|23|34/.exec('1'));//null
    console.log(/12|23|34/.exec('12'));//['12']
    console.log(/12|23|34/.exec('23'));//['23']
    console.log(/12|23|34/.exec('2334'));//['23']
    

      

    匹配模式
      匹配模式(match mode)指匹配时的使用的规则。设置特定的模式,可能会改变对正则表达式的识别。前面已经介绍过创建正则表达式对象时,可以设置'm'、'i'、'g'这三个标志,分别对应多行模式、不区分大小模式和全局模式三种
    i
      默认地,正则表达式是区分大小写的,通过设置标志'i',可以忽略大小写(ignore case)
     console.log(/ab/.test('aB'));//false
     console.log(/ab/i.test('aB'));//true
    m
      默认地,正则表达式中的^和$匹配的是整个字符串的起始位置和结束位置,而通过设置标志'm',开启多行模式,它们也能匹配字符串内部某一行文本的起始位置和结束位置
    console.log(/world$/.test('hello world
    ')); //false
    console.log(/world$/m.test('hello world
    ')); //true
    
    console.log(/^b/.test('a
    b')); //false
    console.log(/^b/m.test('a
    b')); //true 
    g
      默认地,第一次匹配成功后,正则对象就停止向下匹配了。g修饰符表示全局匹配(global),设置'g'标志后,正则对象将匹配全部符合条件的结果,主要用于搜索和替换
    console.log('1a,2a,3a'.replace(/a/,'b'));//'1b,2a,3a'
    console.log('1a,2a,3a'.replace(/a/g,'b'));//'1b,2b,3b' 
    贪婪模式
      默认情况下,量词都是贪婪模式(greedy quantifier),即匹配到下一个字符不满足匹配规则为止

    //exec()方法以数组的形式返回匹配结果
    console.log(/a+/.exec('aaa')) ; //  ["aaa", index: 0, input: "aaa"]     匹配的是 "aaa" 
    懒惰模式
      懒惰模式(lazy quantifier)和贪婪模式相对应,在量词后加问号'?'表示,表示尽可能少的匹配,一旦条件满足就不往下匹配
    {n}?         匹配n次
    {n,m}?       匹配至少n次,最多m次
    {n,}?       匹配至少n次
    ??          相当于{0,1}
    *?          相当于{0,}
    +?          相当于{1,}
    

      

    console.log(/a+?/.exec('aaa')) ; //  ["a", index: 0, input: "aaa"]   匹配的是"a"
    

      

  • 相关阅读:
    UIActivityIndicatorView的详细使用
    iOS开发多线程篇—GCD的常见用法
    UIScrollView的属性总结
    关于UIView的autoresizingMask属性的研究
    Robot FrameWork 教程链接
    数据恢复基础知识
    数据恢复基础知识
    selenium webdriver 学习笔记(三)
    selenium webdriver 学习笔记(二)
    selenium webdriver 学习笔记(一)
  • 原文地址:https://www.cnblogs.com/c9999/p/6296933.html
Copyright © 2011-2022 走看看