我想完成一个正则表达式,它匹配包含该字符在内的某个字符之后的所有内容。例如,如果我的字符串是
"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"
匹配大部分字符串
我怎样才能得到我想要的东西?
答案 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"
/(.*)(:.*)/
然后使用第一个捕获组$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>