使用正则表达式查找匹配项

3

如何找到一个二进制数中被1包围的连续0的长度?

例如,在10010001中,有2个符合条件的字符串:1001和10001。

  • 1001 中连续0的长度为2
  • 10001 中连续0的长度为3

我使用了match函数但只返回了最后一个符合条件的字符串,即10001。

'1010001'.match(/1(0+)1$/g)
6个回答

3
您需要使用前瞻断言来解决此问题:

console.log('1010001'.match(/10+(?=1)/g).map(function(x) {
   return x.length - 1;
}));


1
在正则表达式中,$ 是一个特殊字符,用于匹配字符串的结尾(MDN)。
但这只解决了一半的问题。String#match 捕获了第一个组中的末尾 1,并且无法为 '10001' 创建第二个重叠组。请尝试使用RegExp#exec。正则表达式是有状态的,在这种情况下,您需要为找到的每个匹配将最后一个索引向后移动一个。
var re = /10+1/g;
var str = '10010001';
var matches = [];
var result;
while ((result = re.exec(str)) !== null) {
  matches.push(result[0]);
  re.lastIndex--;
}
console.log(matches);

1

首先,将所有的'1'替换为'11',然后从您的正则表达式中删除$符号。

console.log('10010001'.replace(/1/g, '11').match(/1(0+)1/g));


1
那个可行。但我不明白将1改为11的目的是什么。你能解释一下吗? - Kapil gopinath

0

不要使用正则表达式,保持简单。

  1. 在“1”上拆分字符串
  2. 获取每个部分的长度
  3. 删除第一个和最后一个部分的长度,因为它们没有被“1”包围
  4. 找到最长的部分长度

const maxNumberOfZeros = Math.max(...'000000101000100000'.split('1').map(str => str.length).slice(1, -1));
console.log(maxNumberOfZeros);


这个测试 '101000' 将会失败。 - Daniel Tran
2
@DanielTran 很好的发现!我没有仔细阅读问题:),我已经解决了这个问题。 - Alec Fenichel

0
function solution(N) {    
    let s = (N >>> 0).toString(2).split('');

    let max = 0;
    //1 1 0 0 1 0 0 0 1 0
    if(s.length > 2){

        let lastDigit = s[s.length - 1];
        let firstDigit = s[0];

        while(lastDigit == '0'){
            s.pop();
            if(!s.length || s.length == 1) return 0;
            lastDigit = s[s.length - 1];
        }

        while(firstDigit == '0'){
            s.shift();
            if(!s.length || s.length == 1) return 0;
            firstDigit = s[0];
        }
        
        let x = s.join('').split('1').filter(i => i !== '').sort().reverse();

        return x.length ? x[0].length : 0;

    }

    return 0;
}

-1

RegExp 中的 $ 匹配字符串的结尾。

您可以使用 Array.prototype.reduce() 和逻辑运算来将 10 作为 Boolean 进行评估,以确定序列是否与所需模式匹配。

let nums = ["1000000001010001", "0000000101", "100000000"];
let countZerosBetweenOnes = str => 
  (res => ([...str].reduce((a, b, idx, arr) => 
    (!!+a && !+b && arr.find((n, i) => i > idx && !!+n) && res.push(+a)
    , !+a && !+b && res.length && ++res[res.length - 1], b))
    , res.sort((a, b) => a - b).pop() || 0))([]);

nums.forEach(n => console.log(countZerosBetweenOnes(n)));


2
对于 0000000101 失败。 - Tushar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接