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

时间:2017-11-06 04:17:57

标签: javascript regex

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

例如,在10010001中,2个匹配项为1001和10001

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

我使用了仅返回最后一个的匹配,即10001。

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

6 个答案:

答案 0 :(得分:3)

你需要先行断言:

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

在正则表达式中,import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; public class MainActivity extends AppCompatActivity{ private EditText editText,editText2; private Button button; private TextView luasbangundatar,kelilingbangundatar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText); editText2= (EditText) findViewById(R.id.editText2); button = (Button) findViewById(R.id.button); luasbangundatar = (TextView) findViewById(R.id.luasbangundatar); kelilingbangundatar = (TextView) findViewById(R.id.kelilingbangundatar); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { String edt1 = editText.getText().toString().trim(); String edt2 = editText2.getText().toString().trim(); int formula1 = Integer.parseInt(edt1)*Integer.parseInt(edt2); int formula2 = (2*Integer.parseInt(edt1))+(2*Integer.parseInt(edt2)); luasbangundatar.setText("Luas Dari Bangun Datar :"+String.valueOf(formula1)); kelilingbangundatar.setText("Keliling Dari Bangun Datar:"+String.valueOf(formula2)); } catch (Exception e) { e.printStackTrace(); } } }); } 是与字符串末尾匹配的特殊字符(MDN)。

但这只是问题的一半。 $捕获了第一组中的尾随1,无法为' 10001'创建第二个重叠组。请尝试使用RegExp#exec。正则表达式是有状态的,在这种情况下,您将要为您找到的每个匹配将最后一个索引移回一个。

String#match

答案 3 :(得分:0)

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

  1. 将字符串拆分为'1's
  2. 获取每个部分的长度
  3. 删除第一个和最后一个部分的长度,因为它们没有被“1”
  4. 包围
  5. 查找最高区段长度
  6. const maxNumberOfZeros = Math.max(...'000000101000100000'.split('1').map(str => str.length).slice(1, -1));
    console.log(maxNumberOfZeros);

答案 4 :(得分: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;
}

答案 5 :(得分:-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)));