zoukankan      html  css  js  c++  java
  • JS 字符串的操作

    JS字符串操作还是很频繁,如果同正则表达式结合起来,功能非常强大。

    1.test

       验证字符串是否符合正则表达式。

    /s+/.test(" i'm you");  //true

    它只会返回true和false;

    2.Match

       字符串内检索指定的值,或找到一个或多个正则表达式的匹配。

       匹配到值返回一个数组,否则返回为null。

       2.1 match的使用与正则表达式的g标志有很大的关系,如果正则中没有g,那么第 0 个元素存放的是匹配文本,

       还含有两个对象属性。index 属性是匹配文本的起始字符中的位置,input 属性字符串的引用。

    var str="1 plus 2 equal 3"
    console.log(str.match(/d+/)); 
    //["1", index: 0, input: "1 plus 2 equal 3"]

      注意:如果你需要获得到index属性,应该是:

      str.match(/d+/).index。

      如果正则表达式中有分组:

    var str="1 plus 2 equal 3"
    console.log(str.match(/(d)s+(eq)+/));
    //["2 eq", "2", "eq", index: 7, input: "1 plus 2 equal 3"]

      数组中除了匹配到了正则表达式的部分,还有子表达式的部分。

      2.2 如果正则表达式中有g标志,match() 方法将执行全局检索,找到所有匹配子字符串。

    var str="1 plus 2 equal 3"
    console.log(str.match(/d+/g));
    //["1", "2", "3"]

     Match无法获取到多个子表达式的值,想获取可以用exec。

     3.exec

       在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 match() 返回的数组是相同的。

       区别在于正则表达式是全局时,会有一个lastIndex属性,这个属性匹配文本的最后一个字符的下一个位置。

    var str="1 plus 2 equal 3 2 ep3";
    var regex= /(d)s+(e[qp])+/g;
    console.log(str.match(regex));  
    //["2 eq", "2 ep"]
    console.log(regex.lastIndex);
    //0
    console.log(regex.exec(str));
    //["2 eq", "2", "eq", index: 7, input: "1 plus 2 equal 3 2 ep3"]
    console.log(regex.lastIndex);
    //11

     为了获取到所有的分组,可以这么做:

    var str="1 plus 2 equal 3 3 ep3";
    var regex= /(d)s+(e[qp])+/g,result;
    while((result = regex.exec(str))!== null) {
       console.log(result);
       console.log(regex.lastIndex);
    }
    // ["2 eq", "2", "eq", index: 7, input: "1 plus 2 equal 3 3 ep3"]
    // 11
    // ["3 ep", "3", "ep", index: 17, input: "1 plus 2 equal 3 3 ep3"]
    // 21

    又如:

    var regex=/%([a-z%])/g;
    //匹配%[a-z],%%
    var str="%xx%xxxxxxxxxxxxxxxxxx";
    var res = regex.exec(str);
    //[ '%x', 'x', index: 0, input: '%xx%xxxxxxxxxxxxxxxxxx' ]
    console.log(res);

     4.replace

         用于在字符串中用一些字符替换另一些字符。

         replacement 中的 $ 字符具有特定的含义。如下表所示,它说明从模式匹配得到的字符串将用于替换

    $1、$2、...、$99 与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
    $& 与 regexp 相匹配的子串。
    $` 位于匹配子串左侧的文本。
    $' 位于匹配子串右侧的文本。
    $$ 直接量符号。

       例如:把url中的u=32替换成u=32-8;

    var u = 8;
    window.location.href.replace(/[?&]u=([^&]+)/,function($0,$1){
         return $0.replace($1, $1+ '-' +u);
    })

    下面是debug来格式化字符串,把args参数第一个字符串中的%x,转换成formatters.x返回的字符串!

    exports.formatters = {
        z: function(){
            return "yyyy"
        }
    };
    var index = 0;
    var args = ["%zx%xxxxxxxxxx%zxxxxxxxx","test","test2"];
    function _self(){
        if(!this instanceof _self){
            return  _self();
        }
        this.x = "HI,"
    };
    var self = _self();
    args[0] = args[0].replace(/%([a-z%])/g, function(match, format) {
        // if we encounter an escaped % then don't increase the array index
        if (match === '%%') return ;
        index++;
        // match=%z format=z;match=%x;format=x;match=%z;format=z
        console.log("match="+match);
        console.log("format="+format);
        var formatter = exports.formatters[format];
        if ('function' === typeof formatter) {
            //val=undefined
            console.log("index="+index);
            var val = args[index];
            console.log("val="+val);
            match = formatter.call(self, val);
            //resmatch=yyyy
            console.log("resmatch="+match);
            // now we need to remove `args[index]` since it's inlined in the `format`
            args.splice(index, 1);
            index--;
        }
        return match;
     });
    //args=yyyyx%xxxxxxxxxxyyyyxxxxxxxx,test2
    console.log("args="+args);

    5.lastIndexOf

     lastIndexOf() 方法可返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。

    6.indexOf

    indexOf的第二个参数len是从字符串的len开始检查。如:

    var host="xxx:xxxxh:97326463";
    var offset = 5;
    var index = host.indexOf(':', offset);
    //index=9
    console.log("index="+index);

    更多ES6的字符串操作:https://www.jianshu.com/p/8b1ca2773606

    7.匹配"个数

    //来自于npm包的negotiator包的mediaType.js文件。
    function quoteCount(string) {
      var count = 0;
      var index = 0;
    
      while ((index = string.indexOf('"', index)) !== -1) {
        count++;
        index++;
      }
    
      return count;
    }

     8.套路(获取字符串中的key和value)

    var str="xxx=yyy";
    function A(str){
       var index = str.indexOf('=');
       var key;
       var val;
     
      if (index === -1) {
        key = str;
      } else {
        key = str.substr(0, index);
        val = str.substr(index + 1);
      }
    
      return [key, val];
    }
    A(str);

    9.去掉字符串的“””

    // get the value, unwrapping quotes
      var value = val && val[0] === '"' && val[val.length - 1] === '"'
            ? val.substr(1, val.length - 2)
            : val;
    //还可以通过slice来获取
    var str="hello world";   
    console.log(str.slice(1, -1));
    //ello worl
    //去掉一个数组字符串中的[和]

    function getString(tempArray){
       var str = JSON.stringify(tempArray);
       var start = str.indexOf('[');
       var end = str.lastIndexOf(']');
       return str.slice(start,end);
    };

     
  • 相关阅读:
    使用Xtrabackup 备份mysql数据库
    Myeclipse总结
    intellij idea问题及技巧
    Tomcat相关配置
    Spark常用算子总结
    前端开发经验
    最近用到的SQL语句
    subline text使用心得
    天龙八部谁是主角?(MR词频统计)
    elasticsearch CURL命令
  • 原文地址:https://www.cnblogs.com/liuyinlei/p/5351457.html
Copyright © 2011-2022 走看看