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