正则表达式删除字符后的所有内容,包括该字符

时间:2015-07-29 03:37:49

标签: javascript regex

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

"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"匹配大部分字符串

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

5 个答案:

答案 0 :(得分:4)

Regexpless解决方案:

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

答案 1 :(得分: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方面的最佳解决方案。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

对我而言,我不知道我的答案是否与您的需要相符,但我只想提供帮助。

您可以使用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);

试试吧。

答案 4 :(得分:0)

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

"12:23:34:45:56"

使用gredy匹配
/(.*)(:.*)/

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

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

基准

  

String split.slice.join x 946,879 ops / sec±0.53%(66次运行采样)
  正则表达式替换x 2,685,153 ops / sec±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>