• home > theory > algorithm > Introduction >

    JS正则表达式详解

    Author:[email protected] Date:

    ^ 匹配一个输入或一行的开头, ^a 匹配 "an A ",而不匹配 "An a "$ 匹配一个输入或一行的结尾, a$ 匹配 "An a ",而不匹配 "an A "* 匹配


    ^ 匹配一个输入或一行的开头,/^a/匹配"an A",而不匹配"An a" 

    $ 匹配一个输入或一行的结尾,/a$/匹配"An a",而不匹配"an A" 
    * 匹配前面元字符0次或多次,/ba*/将匹配b,ba,baa,baaa 
    + 匹配前面元字符1次或多次,/ba*/将匹配ba,baa,baaa 
    ? 匹配前面元字符0次或1次,/ba*/将匹配b,ba 
    (x) 匹配x保存x在名为$1...$9的变量中 
    x|y 匹配x或y 
    {n} 精确匹配n次 
    {n,} 匹配n次以上 
    {n,m} 匹配n-m次 
    [xyz] 字符集(character set),匹配这个集合中的任一一个字符(或元字符) 
    [^xyz] 不匹配这个集合中的任何一个字符 
    [\b] 匹配一个退格符 
    \b 匹配一个单词的边界 
    \B 匹配一个单词的非边界 
    \cX 这儿,X是一个控制符,/\cM/匹配Ctrl-M 
    \d 匹配一个字数字符,/\d/ = /[0-9]/ 
    \D 匹配一个非字数字符,/\D/ = /[^0-9]/ 
    \n 匹配一个换行符 
    \r 匹配一个回车符 
    \s 匹配一个空白字符,包括\n,\r,\f,\t,\v等 
    \S 匹配一个非空白字符,等于/[^\n\f\r\t\v]/ 
    \t 匹配一个制表符 
    \v 匹配一个重直制表符 
    \w 匹配一个可以组成单词的字符(alphanumeric,这是我的意译,含数字),包括下划线,如[\w]匹配"$5.98"中的5,等于[a-zA-Z0-9] 
    \W 匹配一个不可以组成单词的字符,如[\W]匹配"$5.98"中的$,等于[^a-zA-Z0-9]。

    exec、test、match、search、replace在JS中用的很频繁
    exec:对string进行正则处理,并返回匹配结果.array[0]为原字符串,array[i]为匹配在整个被搜索字符串中的位置。
    test:测试string是否包含有匹配结果,包含返回true,不包含返回false。
    match(pattern) :根据pattern进行正则匹配,如果匹配到,返回匹配结果,如匹配不到返回null
    search(pattern) :根据pattern进行正则匹配,如果匹配到一个结果,则返回它的索引数;否则返回-1
    replace(pattern,replacement) :根据pattern进行正则匹配,把匹配结果替换为replacement

    举个栗子!
    function checkForm() {
        var u = document.form_name.check.value;
        var s = /^[-a-zA-Z0-9_]+(\.[-a-zA-Z0-9_]+)*@[-a-zA-Z0-9_]+(\.[-a-zA-Z0-9_]+)*$/;
        var a = s.exec(u);
        var a = s.test(u);
        var a = u.match(s);
        var a = u.search(s);
        alert(a);
    }

    在设置g属性后,虽然匹配结果不受g的影响,返回结果仍然是一个数组(第一个值是第一个匹配到的字符串,以后的为分组匹配内容),但是会改变index和lastIndex等的值,将该对象的匹配的开始位置设置到紧接这匹配子串的字符位置,当第二次调用exec时,将从lastIndex所指示的字符位置开始检索。同样match方法在设置了g属性后,也会改变index和lastIndex的值,但是是一次性的。无法像exec那样能逐过程累积,因此无法累积获取下一次检索的位置。

    replace方法是属于String对象的,可用于替换字符串。

    简单介绍:

    StringObject.replace(searchValue,replaceValue)

    1. StringObject:字符串

    2. searchValue:字符串或正则表达式

    3. replaceValue:字符串或者函数

    字符串替换字符串

    'I am loser!'.replace('loser','hero')//I am hero!

    直接使用字符串能让自己从loser变成hero,但是如果有2个loser就不能一起变成hero了。

    'I am loser,You are loser'.replace('loser','hero');//I am hero,You are loser

    正则表达式替换为字符串

    'I am loser,You are loser'.replace(/loser/g,'hero')//I am hero,You are hero

    有趣的替换字符

    replaceValue可以是字符串。如果字符串中有几个特定字符的话,会被转换为特定字符串。

    字符替换文本
    $&与正则相匹配的字符串
    $`匹配字符串左边的字符
    $’匹配字符串右边的字符
    $1,$2,$,3,…,$n匹配结果中对应的分组匹配结果

    使用$&字符给匹配字符加大括号

    var sStr='讨论一下正则表达式中的replace的用法'; 
    sStr.replace(/正则表达式/,'{$&}');//讨论一下{正则表达式}中的replace的用法


    使用$`和$’字符替换内容

    'abc'.replace(/b/,"$`");//aac 
    'abc'.replace(/b/,"$'");//acc

    使用分组匹配组合新的字符串

    '[email protected]'.replace(/(.+)(@)(.*)/,"$2$1")//@nimojs

    replaceValue参数可以是一个函数

    StringObject.replace(searchValue,replaceValue)中的replaceValue可以是一个函数.

    如果replaceValue是一个函数的话那么,这个函数的arguments会有n+3个参数(n为正则匹配到的次数)

    先看例子帮助理解:

    function logArguments(){    
        console.log(arguments);//["[email protected]", "nimojs", "@", "126.com", 0, "[email protected]"] 
        return '返回值会替换掉匹配到的目标' 
    } 
    console.log( 
        '[email protected]'.replace(/(.+)(@)(.*)/,logArguments) 
    )

    参数分别为

    1. 匹配到的字符串(此例为[email protected],推荐修改上面代码的正则来查看匹配到的字符帮助理解)

    2. 如果正则使用了分组匹配就为多个否则无此参数。(此例的参数就分别为”nimojs”, “@”, “126.com”。推荐修改正则为/nimo/查看控制台中返回的arguments值)

    3. 匹配字符串的对应索引位置(此例为0)

    4. 原始字符串(此例为[email protected])

    使用自定义函数将A-G字符串改为小写

    'JAVASCRIPT'.replace(/[A-G]/g,function(){ 
        return arguments[0].toLowerCase(); 
    })//JaVaScRIPT

    使用自定义函数做回调式替换将行内样式中的单引号删除

    '<span style="font-family:\'微软雅黑\';">demospan>'.replace(/\'[^']+\'/g,function(){      
        var sResult=arguments[0]; 
        console.log(sResult);//'微软雅黑' 
        sResultsResult=sResult.replace(/\'/g,''); 
        console.log(sResult);//微软雅黑 
        return sResult; 
    })//<span style="font-family:微软雅黑;">demospan>

    最后的小试牛刀

    这一节是交给阅读者发挥的内容:

    1.使用函数自主实现替换字符

    字符替换文本
    $&与正则相匹配的字符串
    $`匹配字符串左边的字符
    $&rsquo;匹配字符串右边的字符

    使用正则但不使用以上替换字符方法来实现有趣的替换字符中的三个实例。

    2.洗扑克

    需要将ThisNimojs-JavaScript使用正则替换成TJhaivsaNSicmroijpst

    "^The": 开头一定要有"The"字符串; 
    "of despair$":    结尾一定要有"of despair" 的字符串; 
    那么,
     
    "^abc$": 就是要求以abc开头和以abc结尾的字符串,实际上是只有abc匹配 
    "notice": 匹配包含notice的字符串 
    你可以看见如果你没有用我们提到的两个字符(最后一个例子),就是说 模式(正则表达式) 可以出现在被检验字符串的任何地方,你没有把他锁定到两边 
    接着,说说 '*', '+',和 '?', 
     
    他们用来表示一个字符可以出现的次数或者顺序. 他们分别表示:
     
    "zero or more"相当于{0,}, 
     
    "one or more"相当于{1,}, 
     
    "zero or one."相当于{0,1},    这里是一些例子: 
      
    "ab*":    和ab{0,}同义,匹配以a开头,后面可以接0个或者N个b组成的字符串("a", "ab", "abbb", 等); 
     
    "ab+": 和ab{1,}同义,同上条一样,但最少要有一个b存在 ("ab", "abbb", 等.); 
     
    "ab?":和ab{0,1}同义,可以没有或者只有一个b; 
     
    "a?b+$": 匹配以一个或者0个a再加上一个以上的b结尾的字符串. 
    要点, '*', '+',和 '?'只管它前面那个字符.
      
    你也可以在大括号里面限制字符出现的个数,比如 
      
    "ab{2}": 要求a后面一定要跟两个b(一个也不能少)("abb"); 
     
    "ab{2,}": 要求a后面一定要有两个或者两个以上b(如"abb", "abbbb", 等.); 
     
    "ab{3,5}": 要求a后面可以有2-5个b("abbb", "abbbb", or "abbbbb"). 
     
    现在我们把一定几个字符放到小括号里,比如:
       
    "a(bc)*": 匹配 a 后面跟0个或者一个"bc"; 
     
    "a(bc){1,5}": 一个到5个 "bc." 
      
    还有一个字符 '│', 相当于OR 操作: 
      
    "hi│hello": 匹配含有"hi" 或者 "hello" 的 字符串; 
     
    "(b│cd)ef": 匹配含有 "bef" 或者 "cdef"的字符串; 
     
    "(a│b)*c": 匹配含有这样多个(包括0个)a或b,后面跟一个c 
     
    的字符串; 
      
    一个点('.')可以代表所有的单一字符,不包括""n"
    如果,要匹配包括""n"在内的所有单个字符,怎么办?
    对了,用'["n.]'这种模式.
      
    "a.[0-9]": 一个a加一个字符再加一个0到9的数字 
     
    "^.{3}$": 三个任意字符结尾 . 
       
    中括号括住的内容只匹配一个单一的字符 
      
    "[ab]": 匹配单个的 a 或者 b ( 和 "a│b" 一样); 
     
    "[a-d]": 匹配'a' 到'd'的单个字符 (和"a│b│c│d" 还有 "[abcd]"效果一样); 一般我们都用[a-zA-Z]来指定字符为一个大小写英文
     
    "^[a-zA-Z]": 匹配以大小写字母开头的字符串 
     
    "[0-9]%": 匹配含有 形如 x% 的字符串 
     
    ",[a-zA-Z0-9]$": 匹配以逗号再加一个数字或字母结尾的字符串 
      
    你也可以把你不想要得字符列在中括号里,你只需要在总括号里面使用'^' 作为开头 "%[^a-zA-Z]%" 匹配含有两个百分号里面有一个非字母的字符串. 

     

    原文链接:http://www.nimojs.com/blog/javascript-replace/



    转载本站文章《JS正则表达式详解》,
    请注明出处:https://www.zhoulujun.cn/html/theory/algorithm/IntroductionAlgorithms/7712.html