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

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

作者: 深漂浪子 | 来源:发表于2019-06-04 17:59 被阅读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>
    
    
    aaa.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>
    
    

    最近,聪明的网友又找到了其他几种快捷高效的方法,真是太感谢了!

    // 第一种
    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'), ''))
    }
    
    // 第二种
    function getMarkContent_Eg2 (str, start, end) {
      return str.toString().match(new RegExp(`(?<=\\${start})[^${end}]+(?=\\${end})`, 'g')) || []
    }
    
    const testStr = '0  (a)  12  ((((b)  3456  (c(() ';
    const eg1 = getMarkContent(testStr, '(', ')');
    const eg2 = getMarkContent_Eg2(testStr, 'a', ')');
    console.log('eg1', eg1); // -> ["a", "(((b", "c(("]
    console.log('eg2', eg2); // -> ["a", "(((b", "c(("]
    
    
    
    //第三种:
    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/kfgcxctx.html