使用javascript计算字符串中连续数字的最大数量

时间:2018-03-12 09:18:01

标签: javascript regex

示例:'1234567'字符串有:7个连续数字,这些是1234567 示例:'123456'字符串具有:6个连续数字,这些数字为123456

我需要两个

  1. count
  2. 数字序列也作为输出
  3. 请帮助,正则表达式或自定义功能

    我曾经使用过低效的强力方法:

    var m10 = /^\d{10}$/.exec(str);
    var m9 = /^\d{9}$/.exec(str);
    var m8 = /^\d{8}$/.exec(str); 
    

    使用这个我需要m1,m2到m10然后使用if else检查字符串是否有1或10个连续数字然后输出

    时间在这里很重要,所以试图找到优化的方法。

2 个答案:

答案 0 :(得分:0)

您可以使用match和正则表达式\d+

来获取匹配项
var matches = "1234567String".match(/\d+/g);

现在使用reduce

获取最大值
if( matches )
{
    var maxLengthStr = matches.reduce( ( a, c ) => ( c.length > a.length ? c : a ) , "" );
}

您可以将字符串的长度设为

var fnGetMax = str => {
  var matches = "1234567String".match(/\d+/g);
  var maxLengthStr = matches ? matches.reduce( ( a, c ) => (c.length > a.length ? c : a ) , "" ) : "";
  return { value : maxLengthStr , length : maxLengthStr.length }; //return the expression
}

<强>演示

var fnGetMax = str => {
  var matches = "1234567String".match(/\d+/g);
  var maxLengthStr = matches ? matches.reduce((a, c) => (c.length > a.length ? c : a), "") : "";
  return {
    value: maxLengthStr, length: maxLengthStr.length
  }; //return the expression
}

console.log( fnGetMax( "34234ksdf34234ssdcs432sadfe34343" ) );

答案 1 :(得分:0)

如果您正在寻找性能,我认为您应该考虑使用循环,请参阅此示例:

注意:如果两个子串具有相同的长度,则使用此方法将返回第一个(对于最后一个,使用if(s.length >= saved.length))。如果未找到子字符串,则当前返回空字符串。

var result;

	var fnGetMax = str => {
		var matches = str.match(/\d+/g);
		var maxLengthStr = matches ? matches.reduce((a, c) => (c.length > a.length ? c : a), "") : "";
		return {
		value: maxLengthStr, length: maxLengthStr.length
		}; //return the expression
	}
	
	var s = performance.now();
	console.log( result = fnGetMax( "34234ksdf34234ssdcs432sadfe34343" ) );
	var e = performance.now();
	console.log('time: ', e - s);
	document.getElementById('result1').innerHTML = 'REDUCE - string: ' + result.value + ' / length: ' + result.length + ' / timing: ' + (e - s);
	
	var fnGetMax2 = str => {
		var saved = '', s = '', i, l = str.length;
		for(i = 0; i < l; i++){
			if('0123456789'.indexOf(str[i]) !== -1){
				s += str[i];
				if(s.length > saved.length){
					saved = s;
				}
			}else{
				s = '';
			}
		}
		return {
			value: saved, length: saved.length
		}
	}
	
	var s = performance.now();
	console.log( result = fnGetMax2( "34234ksdf34234ssdcs432sadfe34343" ) );
	var e = performance.now();
	console.log('time: ', e - s);
	document.getElementById('result2').innerHTML = 'LOOP - string: ' + result.value + ' / length: ' + result.length + ' / timing: ' + (e - s);
<div id="result1"></div>
<div id="result2"></div>