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);
};

 

 

posted @ 2016-04-04 10:14  anthonyliu  阅读(315)  评论(0编辑  收藏  举报