【问题标题】:Finding matches using regular expression使用正则表达式查找匹配项
【发布时间】:2017-11-06 04:17:57
【问题描述】:

如何找到二进制两端被一包围的连续零的长度?

例如,10010001 中的 2 个匹配项是 1001 和 10001

  • 1001 零的长度为2
  • 10001 零的长度是3

我使用了 match,它只返回最后一个,即 10001。

'1010001'.match(/1(0+)1$/g)

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    这里需要先行断言:

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

    【讨论】:

      【解决方案2】:

      首先,将所有“1”替换为“11”,然后从正则表达式中删除 $ -。

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

      【讨论】:

      • 那行得通。但我不知道将 1 更改为 11 的目的是什么。请您解释一下。
      【解决方案3】:

      在正则表达式中,$ 是匹配字符串结尾的特殊字符 (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);
      

      【讨论】:

        【解决方案4】:

        我会保持简单,而不是使用正则表达式。

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

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

        【讨论】:

        • 这将通过测试失败:'101000'。
        • @DanielTran 好收获!我没有仔细阅读这个问题:),我已经解决了这个问题。
        【解决方案5】:
        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;
        }
        

        【讨论】:

          【解决方案6】:

          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)));

          【讨论】:

          • 0000000101 失败。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-06-01
          • 1970-01-01
          • 2014-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多