【问题标题】:regex remove everything after character including that charecter正则表达式删除字符后的所有内容,包括该字符
【发布时间】:2015-07-29 03:37:49
【问题描述】:

我想完成一个匹配某个字符(包括该字符)之后的所有内容的正则表达式。例如,如果我的字符串是

"12:23:34:45:56"

我想回来

"12:23:34:45"

最后一个: 之后的所有内容都已被删除,包括:

我尝试了以下。

var str1 = "12:23:34:45:56";
str1 = str1.replace(/[^:]*$/,"");
alert(str1);

返回"12:23:34:45:"(需要去掉最后一个:)

我也试过了

var str2 = "12:23:34:45:56";
str2 = str2.replace(/:.*$/,"");
alert(str2);

返回 "12" 匹配大部分字符串

我怎样才能在这里得到我想要的东西?

【问题讨论】:

  • 合并它们:/:[^:]*$/
  • 您不使用lastIndexOf()的任何特殊原因?

标签: javascript regex


【解决方案1】:

正则表达式解决方案:

var r = '12:23:34:45:56'.split(':').slice(0,-1).join(':');
console.log(r); //=> "12:23:34:45"

【讨论】:

    【解决方案2】:

    另一个选项是肯定的lookahead

    var result = '12:23:34:45:56'.match(/(.+)(?=:).+/, '$1')[1];
    

    或者,正如Matt Way 已经指出的那样,lastIndexOf

    var result = '12:23:34:45:56'.slice(0, '12:23:34:45:56'.lastIndexOf(':'));
    

    更新:lastIndexOf & slice 看起来是 performance 的最佳解决方案。

    【讨论】:

      【解决方案3】:

      也许你应该考虑这个简单的解决方案:

      var str='12:23:34:45:56';
      var len = str.length;
      while(len && str[len]!==':')len--;
      var result = str.substr(0,len) 
      console.log(result); // will output=> 12:23:34:45
      

      测试:

      var i=0;
      var tryIt=function(){
          var inputStr=document.getElementById('input').value;
          var len = inputStr.length;
          while(len && inputStr[len]!==':')len--;
          var str = inputStr.substr(0,len) 
          console.log(str); // will output=> 12:23:34:45
          document.getElementById('output').innerHTML = 'result N°'+ (i++) + ' : <span>' + str + '</span>';
        }
      document.getElementById('tryButton').onclick = tryIt;
      input {
        padding : 6px;
        margin  : 3px;
        font-size : 1em;
      }
      div {
        margin : 6px;
        }
      span {
        border : solid 1px #999;
        border-radius : 9px ;
        padding : 6px;
        }
      <div><input type='text' id='input' value='12:23:34:45:56' ></div>
      <div id='output'></div>
      <hr><button id='tryButton'>try it</button>

      基准测试:

      var inputStr = '12:23:34:45:56';
      var len = inputStr.length ;
        
      var suite = new Benchmark.Suite('foo', {
        'onStart': function(event) {
          console.log(this, event);
          out("Benchmark running... (please don't scroll)");
        },
        'onCycle': function(event) {
          console.log(this, event);
          out(String(event.target));
        },
        'onComplete': function(event) {
          console.log(this, event);
          out('Benchmark ended.');
          out('Fastest is "' + this.filter('fastest').pluck('name')+'"');
        }
      });
      
      suite.add("String split.slice.join", function() {
        var str = inputStr.split(':').slice(0, -1).join(':');
      });
      suite.add("Positive lookahead:", function() {
        var str = inputStr.match(/(.+)(?=:).+/, '$1')[1];
      });
      suite.add("Regex replace", function() {
        var str = inputStr.replace(/(.+):.+/, "$1");
      });
      suite.add("While loop", function() {
        len = inputStr.length;
        while(len && inputStr[len]!==':')len--;
        var str = inputStr.substring(0,len) 
      });
      
      suite.add("Slice lastIndeOf", function() {
        var str = inputStr.slice(0, inputStr.lastIndexOf(':'));
      });
      suite.add("While loop, with outside len", function() {
        while(len && inputStr[len]!==':')len--;
        var str = inputStr.substring(0,len) 
      });
      
      
      suite.run({
        'async': true
      });
      
      function out(str) {
        output.innerHTML += str + "\n";
      }
      <script src="https://cdnjs.cloudflare.com/ajax/libs/benchmark/1.0.0/benchmark.js"></script>
      <pre id="output"></pre>

      编辑: 修改后的基准测试

      最好的选择是使用@CPH4 解决方案(由Matt Way 注明):Slice.lastIndexOf

      但如果您的文本输入具有相同的长度,那么您必须考虑negative while loop

      【讨论】:

        【解决方案4】:

        对我来说,我不知道我的答案是否符合您的需要,但我只是想提供帮助。

        您可以使用 split() 函数来解决该问题,而不是使用 replace() 函数:

        示例:

        var mystr = '12:23:34:45:56';
        var myarr = mystr.split(":");
        var myvar = myarr[0] + ":" + myarr[1] + ":" + myarr[2] + ":" + myarr[3];
        
        alert(myvar);
        

        或者您可以使用它来删除最后一个:

        var mystr = '12:23:34:45:56';
        var myarr = mystr.split(":");
        myarr.pop();
        var myvar = myarr.join(":");
        
        alert(myvar);
        

        让我们试试吧。

        【讨论】:

        • 第一个选项很糟糕。第二种选择更合理。
        【解决方案5】:

        将你需要的部分封装在一个捕获组中,然后你可以使用$n来获取它。

        "12:23:34:45:56"使用贪婪匹配

        /(.*)(:.*)/
        

        然后使用第一个捕获组$1 将是"12:23:34:45" 和$2 ":45"

        var str = "12:23:34:45:56".replace(/(.+):.+/,"$1");
        document.write(str);

        基准测试

        字符串 split.slice.join x 946,879 ops/sec ±0.53%(采样 66 次运行)
        正则表达式替换 x 2,685,153 操作/秒 ±0.87%(采样 67 次运行)
        基准测试结束。最快的是“正则表达式替换”

        var suite = new Benchmark.Suite('foo', {
          'onStart': function(event) {
            console.log(this, event);
            out("Benchmark running... (please don't scroll)");
          },
          'onCycle': function(event) {
            console.log(this, event);
            out(String(event.target));
          },
          'onComplete': function(event) {
            console.log(this, event);
            out('Benchmark ended.');
            out('Fastest is "' + this.filter('fastest').pluck('name')+'"');
          }
        });
        
        suite.add("String split.slice.join", function() {
          var str = '12:23:34:45:56'.split(':').slice(0, -1).join(':');
        });
        
        suite.add("Regex replace", function() {
          var str = "12:23:34:45:56".replace(/(.+):.+/, "$1");
        });
        
        suite.run({
          'async': true
        });
        
        function out(str) {
          output.innerHTML += str + "\n";
        }
        <script src="https://cdnjs.cloudflare.com/ajax/libs/benchmark/1.0.0/benchmark.js"></script>
        <pre id="output"></pre>

        【讨论】:

        • 如果第二组没有被使用或以任何方式保存,为什么要使用它呢?为什么不直接使用/(.*):.*/
        猜你喜欢
        • 1970-01-01
        • 2011-09-08
        • 2018-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-20
        • 2017-08-29
        • 1970-01-01
        相关资源
        最近更新 更多