• Javascript语言精粹之String常用方法分析


    Javascript语言精粹之String常用方法分析

    1. String常用方法分析

    1.1 String.prototype.slice()

    slice(start,end)方法复制string的一部分来构造一个新的字符串

    start<0时,它将于string.length相加

    end参数可选,默认值为string.length。如果end<0,它将于string.length相加

    var text='and in it he say " Any damn fool could';
    var a=text.slice(18);
    //a 是 '" Any damn fool could'
    var b = text.slice(0,3);
    //b 是 'and'
    var c = text.slice(-5);
    //c 是 'could'

    1.2 String.prototype.substring()

    substring方法不能处理负数参数

    javascript语言精粹作者不建议使用substring,建议用slice

    对于substring()、slice()、substr(),这里有篇文章有详细的对比

    http://www.cnblogs.com/ider/p/js-slice-vs-substr-vs-substring-table.html

     摘一下文中的结论

    三个方法之间的主要区别如下:
    1. 三个方法的参数1都代表子串开始位置,参数2在slice和substring中表示结束位置,而在substr中代表的则是子串长度;
    2. 对于负数态度,当出现在参数1的位置时,slice和substr从末尾开始计算,而substring不支持末尾计数法直接视为0;当出现在参数2位置时,slice和substring的处理同参数1:前者从末尾开始计算,后者转换成0,而substr则视负数长度为0返回空串;
    3. 对于参数1大于参数2的情况,substring最大的不同在于它会交换两个参数再截取子串,substr因第二参数表示的是长度因此并无异常,slice曽依然正常搜寻子串始末位置,若开始位置在结尾后边则返回空串。

    1.3 String.prototype.match()

    string.match方法匹配一个字符串和一个正则表达式。它依据g标识来判断怎样匹配,如果没有g标识,则string.match(regexp)和调用regexp.exec(string)结果相同。如果有g标识,它返回一个包含了除捕获分组之外的所有匹配的数组。注意,捕获组不包含的。

    var text='<html><body bgcolor=linen><p>This is <b>bold</b>!</p></body></html>';
    var tags=/[^<>]+|<(/?)([A-Za-z]+)([^<>]*)>/g;
    var a=text.match(tags);
    
    a=["<html>", "<body bgcolor=linen>", "<p>", "This is ", "<b>", "bold", "</b>", "!", "</p>", "</body>", "</html>"]

     string.match和RegExp.exec区别

    var someText="web2.0 .net2.0";
    var pattern=/(w+)(d).(d)/g;
    var outCome_exec=pattern.exec(someText);
    var outCome_matc=someText.match(pattern);
    //outCome_exec:["web2.0", "web", "2", "0"]
    //outCome_matc:["web2.0", "net2.0"]
    
    var someText="web2.0 .net2.0";
    var pattern=/(w+)(d).(d)/; //不带g
    var outCome_exec=pattern.exec(someText);
    var outCome_matc=someText.match(pattern);
    //outCome_exec :["web2.0", "web", "2", "0"]
    //outCome_matc:  ["web2.0", "web", "2", "0"]

    1)exec是RegExp对象方法,match是String对象方法;

    2)如果没有找到结果,则二者都返回null;

    3)只有在正则表达式必须指定全局g属性时,match才能返回所有匹配,否则match与exec方法结果无差异,是等价的;

    4)exec永远返回与第一个匹配相关的信息,其返回数组第一个值是第一个匹配的字串,剩下的是所有分组的反向引用(即子括号的匹配内容);

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

    1.4 String.prototype.replace

    replace(searchValue,replaceValue)方法对string进行查找和替换的操作,并返回一个新的字符串。

    当searchValue是字符串时,searchValue仅在第一次出现的位置被替换

    var result="mother_in_law".replace('_','-');
    result="mother-in_law";

    当searchValue是一个正则表达式并且带有g标识,它将替换所有匹配;如果没有g标识,仅将替换第一个匹配

    var oldareacode=/((d{3}))/g;
    var p='(555)666-(121)2'.replace(oldareacode,'$1-');
    
    p = "555-666-121-2";

    当replaceValue是一个函数时,此方法对每一个匹配调用它,将该函数返回的字符串用作替换文本。

    var p="1a1c".replace(/d/g,function(){
        return 'X';
    });
    p="XaXc";

    如果replaceValue函数需要更复杂的处理逻辑,可以为该函数传入参数,第一个参数是整个被匹配的文本,第二个参数是分组1捕获的文本,第二个参数是分组2捕获的文本,以此类推

    //将一个句子的所有单词首字母大写
    var result="hello world".replace(/(w)w*/g,function(a,b){
        return b.toUpperCase()+a.slice(1);
    });
    
    result="Hello World"

    书中一个简易的html转义方法

    String.prototype.entityify=function(){
        var character={
            '<':'&lt;',
            '>':'&gt;',
            '&':'&amp;',
            '"':'&quot;'
        };
        return function(){
            return this.replace(/[<>&"]/g,function(c){
                return character[c];
            });
        };
    }();
    alert("<&>".entityify());//&lt;&amp;&gt;

    1.5 String.prototype.split()

    string.split(separator,limit)方法把string分割成片断来创建一个字符串数组。

    可选参数limit可以限制被分割的片断数量。separator参数可以是一个字符串或一个正则表达式

    如果separator是一个空字符串,将返回一个单字符的数组:

    var digits='0123456789';
    var a=digits.split('',5);
    a=["0", "1", "2", "3", "4"]

    如果separator非空,split会查找所有separator出现的地方

    var c = 'a|b|c|'.split('|');
    c=['a','b','c',''];

    如果split参数为正则表达式

    var text='last, first     ,middle';
    var res=text.split(/s*,s*/);
    
    res=["last", "first", "middle"]

    如果split参数为正则表达式,来自捕获组的文本将被包含在分割后的数组中

    var text='last, first     ,middle';
    var res=text.split(/s*(,)s*/);
    
    res=["last",",","first",",","middle"]

    1.6 String.prototype.search()

    search方法和indexOf方法类似,只是它接受一个正则表达式作为参数而不是一个字符串

    如果找到匹配,它返回第一个匹配的首字符位置,如果没有找到匹配,返回-1

  • 相关阅读:
    杭电2063 过山车 匈牙利算法
    杭电2023 平均成绩
    leveldb性能分析
    linux下libreoffice安装测试
    iptables配置vsftp访问
    vsftp访问异常
    mysql二进制安装
    vi命令
    mysql配置优化
    rsync 配置
  • 原文地址:https://www.cnblogs.com/GongQi/p/4509788.html
Copyright © 2020-2023  润新知