美文网首页前端小结
封装一个获取字符串刮号内的字符方法

封装一个获取字符串刮号内的字符方法

作者: 深漂浪子 | 来源:发表于2019-03-14 15:40 被阅读0次

最近做项目的时候有一处对接收的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(("]

相关文章

网友评论

    本文标题:封装一个获取字符串刮号内的字符方法

    本文链接:https://www.haomeiwen.com/subject/vufcmqtx.html