最近做项目的时候有一处对接收的json数据做截取字符的逻辑,主要是获取关于字符串内部带有刮号()的字符内容,所以就简单的封装了下相关方法,该方法适合匹配以下几个符号:() 、[] 、<> 、《》、 “”、 ‘’、〔〕、{}、「」、〖〗等相关带有闭合的符号。具体应用方式如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>字符串截取刮号内部字符方法封装</title>
</head>
<body>
</body>
<script type="text/javascript">
function strIn(str,mark){
//获取刮号内容
var arr = mark.toString().split("");
var leftStr = arr[0],
rightStr = arr[1];
//字符串内容转为数组
var strArr = str.split("");
//leftArr左刮号 rightArr右刮号 singArr单/双引号(字符串中单/双引号一般不会同时出现)
var leftArr = [],
rightArr = [],
singArr = [];
for (var i in strArr) {
if(strArr[i]=="'"){
singArr.push(Number(i));
}else if(strArr=='"'){ //
singArr.push(Number(i));
}else{
if(strArr[i]===leftStr){
leftArr.push(Number(i));
}
if(strArr[i]===rightStr){
rightArr.push(Number(i));
}
}
}
var odd = [];//奇数
var even = [];//偶数
var resultArr = [];
if(leftArr.length>0){//一般刮号
if(leftArr.length===rightArr.length){
for (var j = 0;j<leftArr.length;j++) {
resultArr.push(str.substring(leftArr[j]+1,rightArr[j]))
}
}
}else if(singArr.length>0){//单双引号
for (var m in singArr) {
if(m%2==0){
even.push(Number(m));
}else if(m%2==1){
odd.push(Number(m));
}
}
for (var n in even) {
resultArr.push(str.substring(singArr[even[n]]+1,singArr[odd[n]]))
}
}
return resultArr.length>1?resultArr:resultArr[0];
}
//调用函数方法
var str = "123'666 '(54)'55(33)'";
var aa = strIn(str,"''");
console.log(aa);
document.write(aa)
</script>
</html>
该函数strIn()参数1为要截取的字符串,参数2为需要指定截取的刮号符号。
123.png
还有一种更简单的方法,就是直接利用正则表达式的match方法来截取,简单粗暴,代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>字符串截取刮号内部字符方法封装</title>
</head>
<body>
</body>
<script type="text/javascript">
function strIn(str,mark){
var regex = toRegex(mark);
var arr = [],
resultArr = [];
arr = str.match(regex);
for (var i in arr) {
resultArr.push(arr[i].substring(1,arr[i].length-1))
}
return resultArr.length>1?resultArr:resultArr[0];
}
function toRegex(mark){
//获取刮号内容
var arr = mark.toString().split("");
var leftStr = arr[0],
rightStr = arr[1];
var xiegang = '\\';
var a = '(.+?)\\';
var str = xiegang +leftStr + a + rightStr;
return eval('/'+ str+'/g');
}
//调用函数方法
var str = "123'666 '(54)'55(33)'";
var bb = strIn(str,"''");
console.log(bb);
document.write(bb)
</script>
</html>
最近有网友根据正则,利用了es6的新属性(箭头函数,const声明等)又对该方法做了简化:
function getMarkContent (str, start, end) {
const arr = str.match(new RegExp(`\\${start}[^${end}]+\\${end}`, 'g'))
return !arr ? [] : arr.map(item => item.replace(new RegExp(`\^\\${start}|\\${end}\$`, 'g'), ''))
}
const testStr = '0 (a) 12 ((((b) 3456 (c(() ';
console.log(getMarkContent(testStr, '(', ')')); // -> ["a", "(((b", "c(("]
网友评论