Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript中使用正则表达式替换来查找字符串中匹配字符的最长序列?_Javascript_Regex - Fatal编程技术网

如何在javascript中使用正则表达式替换来查找字符串中匹配字符的最长序列?

如何在javascript中使用正则表达式替换来查找字符串中匹配字符的最长序列?,javascript,regex,Javascript,Regex,提出的问题是: 给定一个整数0

提出的问题是: 给定一个整数0
2x 9
1x 3
3x 4
1x 5
4x 6
2x 4
在提供的数字中。 我知道我可以用一些计数器和循环来解决这个问题,但我认为最好用正则表达式来解决这个问题


如果问题扩展到任何字符串中的最大连续字符数(不限于数字),我将如何做?

问题的第一点是计算所提供数字中的重复数字数。 我们可以使用javascript的字符串替换函数,该函数允许我们指定要替换的正则表达式模式,并允许我们传递一个函数以基于匹配组应用一些逻辑

// The input value, perhaps from reading file...
var inputNumber = readline(); // "9934445666644"

// The input being a string we can use the replace function on it.
var repeatCount = inputNumber.replace(
                 /(0+|1+|2+|3+|4+|5+|6+|7+|8+|9+)/g,
                 function(x){return x.length+" "}); // "2 1 3 1 4 2"
// convert the count string to an array of 
var counts = repeatCount.split(" "); //  [2,1,3,1,4,2]

// Return the maximum number in the counts array.
var highestCount = Math.max.apply(Math, counts); // 4

也许有更好的方法可以做到这一点,但这是我对regex有限的知识所能想到的最好方法。

您可以使用
for
循环,将数组的属性名设置为number,如果对象属性名称在嵌套的
处与
循环匹配,则增加属性值,该循环从当前索引+1迭代到输入结束

返回数组,该数组的第一个元素设置为原始字符串中匹配字符的最大序列的开头的索引,第二个元素设置为匹配字符的最大序列的序列长度的结尾

.slice()
for
循环可用于检索最大匹配序列的字符

let value=[“993444566644”
,数组。from(“99344456466644”)
,“aaBBBCCCdd333*******11111”];
//`input`:字符串,数组
函数greatestSequence(输入){
对于(var i=0,res=[];ilog(“值[2]索引:”,g2,“值:”,值[2]。切片(g2[0],g2[1])我认为正则表达式在这里不是很有用。我要做的就是在数字的十进制表示字符串上迭代一次:

让N=993444566644;
设str=N.toString();
设currentHighest=1;
设totalHighest=1;
设lastDigit=str[0];
//不需要,但显示它是哪个数字
//这种情况经常发生
设最高位数=str[0];
for(设i=1;i总最高){
totalHighest=当前最高;
最高位数=str[i];
}
}
log(`${highestDigit}在一行中出现${totalHighest}次。`)可以与拆分的数字一起使用

函数getCount(n){
return(n).toString().split(“”).reduce(函数(r,a){
如果(r.last==a){
r、 max=Math.max(++r.count,r.max);
}否则{
r、 last=a;
r、 计数=1;
}
返回r;
},{last:'',计数:0,最大值:0});
}

日志(getCount(993444566644))您可以提取连续相同字符的所有块(这里,我们可能只匹配数字),然后找到最长的匹配

正则表达式看起来相当基本:

/(\d)\1*/g
它将匹配并在组1中捕获一个数字(请参见
(\d)
),然后在组1中捕获零个或多个(由于
*
量词)值

这意味着它将匹配由一个数字组成的块,如果字符串中没有重复的数字,这将非常有用

代码如下所示

console.log((Math.max.apply(Math, "9934445666644".match(/(\d)\1*/g))+"").length);

console.log((Math.max.apply(Math,“9934445666644.match”(/(\d)\1*/g))+“”)长度)连续与否?由谁提出的问题?为什么您认为regexp是一个好的解决方案?如果问题被延长了,那么你是否也被延长了,包括这个问题?@WiktorStribiżew-你应该发表你的评论,因为答案绝对是完美的。请将其作为答案发布,因为您的答案正是我想要的,您应该得到更多的选票。发布了解释,请参见下面。有人将此作为答案进行了评论:console.log((Math.max.apply(Math,“9934445666644.match”(/)\1*/g))+”).length),它绝对完美无瑕,因此正则表达式在这里非常有用。@IgnitiousNites如果您问我,这一行的可读性值得怀疑,而且它比上述解决方案使用了更多的资源(对于给定的输入,快速脏测试中的迭代似乎要快10-25倍,具体取决于浏览器)。谢谢。我在这里学到了两件事,反向引用和match返回匹配字符串的列表。“非常棒”在未来将非常有用。谢谢。虽然这给出了正确的答案,但a正在研究如何使用正则表达式来获得答案。答案是否有用?