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

    g 代表全局匹配
    m 代表可以进行多行匹配
    i 代表不区分大小写匹配
    ^ 匹配输入字符串的开始位置
    $ 匹配输入字符串的结束位置
    * 匹配前面的子表达式零次或多次. 等价于{0,}
    + 匹配前面的子表达式一次或多次. 等价于{1,}
    ? 匹配前面的子表达式零次或一次. 等价于{0,1} , 当该字符跟在任何一个其他限制符(*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。
    d 匹配一个数字字符. 等价于 [0-9]
    D 匹配一个非数字符. 等价于 [^0-9]
    w  ,等价于 "[A-Za-z0-9_]"
    W 匹配任何非单词字符,等价于"[^A-Za-z0-9]"
    s 匹配任何空白字符, 包括空格 制表符 换页符 等等. 等价于[f v]
    S 匹配任何非空白字符. 等价于 [^f v]
     匹配一个单词边界,也就是指单词和空格间的位置。
    B 匹配非单词边界。

    (pattern):匹配pattern 并获取这一匹配。

    (?:pattern):匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

    (?=pattern):正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

    (?!pattern):负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

    /^[u4e00-u9fa5]{2,4}$/g    //匹配2-4个汉字

    /^w{6,18}$/           //匹配6到18个(字母,数字,下划线)字符

    /</?[^>]*>/gm         //匹配HTML标签

    /(^s*)|(s*$)/g         //匹配左右两端的空格

    /([a-z]+) 1/gim      //匹配两个连续的以空格分开的相同单词,'1'用来指定第一个子匹配

    /Cha/             //匹配单词 'Chapter' 的前三个字符

    /ter/              //匹配单词 'Chapter' 中的 'ter'

    /Bapt/              //匹配 'Chapter' 中的 'apt',但不会匹配 'aptitude' 中的'apt'

    正则表达式的方法

    1、test方法

    返回一个Boolean值,它指出在被查找的字符串中是否存在模式。

      var url="http://msdn.microsoft.com:80/scripting/default.html?search=abc&name=xiaoming#page=1";
      var reg=/(w+)://([^/:]+)(:d*)?(/[^?#]*)?(?[^/#]*)?(#.*)?/;
      var flag=reg.test(url);
      flag  //返回true
      RegExp.$1//返回"http"
      RegExp.$2 //返回"msdn.microsoft.com"
      RegExp.$3 //返回":80"
      RegExp.$4//返回"/scripting/default.html"
      RegExp.$5 //返回"?search=abc&name=xiaoming"
      RegExp.$6 //返回"#page=1"

    search和test方法都不能更新全局RegExp对象,所以RegExp.input,RegExp.index,RegExp.lastIndex返回undefined。

    2、match 方法

    使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。

    如果match方法没有找到匹配,返回null。如果找到匹配返回一个数组并且更新全局RegExp对象的属性以反映匹配结果。

    match方法返回的数组有两个属性:input、index(如果全局匹配,则无)。
    input属性包含整个的被查找的字符串。
    index属性包含了在整个被查找字符串中匹配的子字符串的位置。

    如果没有设置全局标志(g),数组的0元素包含整个匹配,而第1到n元素包含了匹配中曾出现过的任一个子匹配。这相当于没有设置全局标志的exec方法。如果设置了全局标志,元素0到n中包含所有匹配。

    example1(没有设置全局标志)

    var str="user1testuser2dsfsd";
    var reg=/userd/;
    var arr=str.match(reg);
    arr   //返回"user1",
    arr[0]  //返回"user1"
    arr[1]  //返回 undefined,因为这里没有子匹配
    arr.input //返回"user1testuser2dsfsd"
    arr.index //返回0

    example2(设置了全局标志)

    var str="user1testuser2dsfsd";
    var reg=/userd/g;
    var arr=str.match(reg);
    arr   //返回"user1,user2"
    arr[0]  //返回"user1"
    arr[1]  //返回"user2"
    arr.input //返回"undefined"
    arr.index //返回"undefined"

    3、exec方法

    用正则表达式模式在字符串运行查找,并返回包含该查找结果的一个数组。

    如果exec方法没有找到匹配,则它返回null。如果它找到匹配,则exec方法返回一个数组,并且更新全局RegExp对象的属性,以反映匹配结果。exec方法返回的数组有两个属性(同不含g的match方法),分别是input、index(lastIndex可以通过RegExp.lastIndex获得)。数组的0元素包含了完整的匹配,而第1到n元素中包含的是匹配中出现的任意一个子匹配。这相当于没有设置全局标志(g)的match方法。

    如果设置了全局标志,它会在 RegExpObject 的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。

    如果没有设置全局标志,exec忽略lastIndex的值,从字符串的起始位置开始搜索。我们可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。

    提示:请注意,无论 RegExpObject 是否是全局模式,exec() 都会把完整的细节添加到它返回的数组中。这就是 exec() 与 String.match() 的不同之处,后者在全局模式下返回的信息要少得多。因此我们可以这么说,在循环中反复地调用 exec() 方法是唯一一种获得全局模式的完整模式匹配信息的方法。

    example1(没有设置全局标志)
    var str="user1testuser2dsfsd";
    var reg=/userd/;
    var arr=reg.exec(str);
    arr   //返回"user1",
    arr[0]  //返回"user1"
    arr[1]  //返回 undefined,因为这里没有子匹配,也可通过RegExp.$n来获取
    arr.input //返回"user1testuser2dsfsd"
    arr.index //返回0

    可以看到没有设置全局标志(g)时,match方法和exec方法相同。

    example2(设置全局标志)
    var str="user1testuser2dsfsd";
    var reg=/userd/g;
    var arr=reg.exec(str);
    var arr1=reg.exec(str);
    arr   //返回"user1",
    arr1 //返回"user2",

       
    4、search方法

    返回与正则表达式查找内容匹配的第一个子字符串的位置。

    search方法指明是否存在相应的匹配 。如果找到一个匹配,search方法将返回一个整数值,指明这个匹配距离字符串开始的偏移位置。如果没有找到匹配,则返回-1。
      
    example1:

    var str="dfsuser1testuser2dsfsd";
    var reg=/userd/g;
    var arr=str.search(reg);  //返回3

    search和test方法都不能更新全局RegExp对象,所以RegExp.input,RegExp.index,RegExp.lastIndex返回undefined。

    5、 replace方法

    返回根据正则表达式进行文字替换后的字符串的复制

    能更新全局RegExp对象,返回与正则表达式查找内容匹配的第一个子字符串的位置。

    参数m

    附加参数m,表明可以进行多行匹配,但是这个只有当使用^和$模式时才会起作用,在其他的模式中,加不加入m都可以进行多行匹配(也就是说多行的字符串也是一个普通字符串)。

    example1:

    var regx=/userd/;
    var str=“sdfsfsdfsdf
    sdfsuser3 dffs
    b76dsf user6”;
    var rs=str.match(regx);
    此时不加参数g,则返回{user3},加入参数g返回{user3,user6},加不加入m对此没有影响。

    example2:
    var regx=/^b./;
    var str=“ret76 dfsdf
    bjfsdfs dffs
    b76dsf sdfsdf”;
    var rs=str.match(regx);
    此时rs的值为null,如果加入g,rs的值仍然为null,如果加入m,则rs的值为{bj}(也就是说,在第一行没有找到匹配,因为有参数m,所以可以继续去下面的行去找是否有匹配),如果m和g都加上,则返回{bj,b7}(只加m不加g说明,可以去多行进行匹配,但是找到一个匹配后就返回,加入g表明将多行中所有的匹配返回,当然对于match方法是如此,对于exec,则需要执行多次才能依次返回)。

  • 相关阅读:
    The type java.util.Map$Entry cannot be resolved. It is indirectly referenced。。.相似的错误
    ViewPager的使用
    mysql学习笔记 第九天
    mysql学习笔记 第八天
    mysql学习笔记 第七天
    mysql学习笔记 第六天
    mysql学习笔记 第五天
    Vue.js最佳实践(五招让你成为Vue.js大师)
    前端路由简介以及vue-router实现原理
    Maven整体认识——详细介绍
  • 原文地址:https://www.cnblogs.com/aaron-shu/p/4104443.html
Copyright © 2011-2022 走看看