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,则需要执行多次才能依次返回)。

  • 相关阅读:
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 88怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 81.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 40怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 24.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 21.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器试运行提示过速度保护怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器如何执行绝对值清零
    倍福TwinCAT(贝福Beckhoff)基础教程 松下绝对值驱动器如何做初始化设置
    倍福TwinCAT(贝福Beckhoff)基础教程 松下官方软件开启报错伺服未就绪怎么办
    JAVA Eclipse 启动 Eclipse 弹出“Failed to load the JNI shared library jvm_dll”怎么办
  • 原文地址:https://www.cnblogs.com/aaron-shu/p/4104443.html
Copyright © 2011-2022 走看看