Мне нужно регулярное выражение, чтобы проверить, что текущий индекс массива отсутствует в определенном диапазоне чисел

#javascript #regex

Вопрос:

Я знаю, что здесь много информации о регулярных выражениях, но я действительно не могу заставить это работать. У меня есть цикл for, проходящий через массив. Я хочу посмотреть, не равен ли текущий индекс массива группе чисел (32-64). Я объявил переменную let patt , которая содержит регулярное выражение, которое, по моему мнению, должно работать, но я не могу понять синтаксис, чтобы проверить его. Я был уверен , что так и будет .match , но опять же, не знаю, как сказать !.совпадение

любые советы, решения или даже указания в направлении хорошего руководства по регулярным выражениям JS будут высоко оценены!

 class ShiftCipher{
    constructor(shift){
      this.shift = shift;
    }
    encrypt(string){
      let up = string.toUpperCase();   //convert string to uppercase
      let uni = [];
      let newArr = [];
      let i, j;
      let patt = /[32-64]/g;            //think this is wrong...

      for(i = 0; i < up.length; i  ){
        uni.push(up.charCodeAt(i))      //push converted chars as unicodes to new array
        if(uni[i] != 32){              // if unicode is 32 (space) leave as is.  //I want a regex here for != unicode 32 - 64
          uni[i]  = this.shift;        // shift unicode by parent class specification (shift)
      }
    }
      for(j = 0; j < up.length; j  ){
        if(uni[j] > 90){            // if unicode is higher than 90(z)..
          uni[j] -= 26;             // loop back round starting at (a).
      }
      let text = String.fromCharCode(uni[j]); //convert from unicode to string
      newArr.push(text);                       //push string to array
    }
    
    let final = newArr.join('');      //join array elements(as a string) and store in final
    console.log(final);               
  }
}
  
  const cipher = new ShiftCipher(2);
  cipher.encrypt('I love to code z!');
 

Комментарии:

1. Регулярное выражение /[32-64]/ проверяет, содержит ли строка один символ, равный 3, от 2 до 6 или 4, так что да, работает не так, как можно было бы ожидать. Если я могу спросить, достаточно ли решения, которое не включает регулярные выражения, или это строгое требование, чтобы вам нужно было использовать регулярное выражение?

2. этого было бы достаточно, но я действительно хочу начать понимать и использовать регулярные выражения, так как мой код уже слишком длинный. но любое решение-это хорошее начало!

Ответ №1:

Я хочу посмотреть, не равен ли текущий индекс массива группе чисел (32-64)

Коды символов-это числа. Попробуйте провести численные сравнения.

 for (i = 0; i < up.length; i  ) {
  if (up.charCodeAt(i) >= 32 amp;amp; up.charCodeAt(i) <= 64) {
    // ...
  }
}
 

Но технически вы тоже можете использовать регулярные выражения. Создание диапазона символов из кодов символов работает следующим образом:

 var patt = /[x20-x40]/;   // hex 20 = decimal 32, hex 40 == decimal 64

for (i = 0; i < up.length; i  ) {
  if (patt.test(up.charAt(i)) {
    // ...
  }
}
 

Обратите внимание, что это использует .charAt() .

Это /[x20-x40]/ интерпретируется так, как если бы вы написали настоящие символы, поэтому в данном случае это эквивалентно /[ -@]/ .

Комментарии:

1. Боюсь, это, похоже, не сработало. Результат: I"LOVE"TO"CODE"Z#

2. @R. Лоуренс, я не отладил вашу функцию. Я показал вам, где вы ошиблись в своем базовом предположении. Боюсь, вам придется отлаживать свою функцию самостоятельно. 🙂

3. Хорошо, спасибо. Я покопаюсь немного глубже. Ваше решение для регулярных выражений тоже очень полезно.

4. @Ravikumar Я думаю, что этот комментарий был для меня. Почему ты думаешь, что /[x20-x40]/ это не сработает?

5. @R. Лоуренс Не пытайся решить все сразу. Я предлагаю вам начать ровно с одного for цикла, который печатает для каждого символа входной строки сам символ, его код символа, ваш измененный код символа и результирующий символ. Затем вы добавляете if , что исключает определенные коды символов из модификации. Затем вы добавляете «цикл вокруг» для более высоких кодов символов. И как только вы увидите, что все это работает, вы займетесь созданием выходной строки и ее возвратом.

Ответ №2:

Поскольку ваша константа окружности равна 26, длине английского алфавита, можно предположить, что вы хотите изменить только буквы, а затем волшебное регулярное выражение [A-Z] :

 class ShiftCipher {
  constructor(shift) {
    this.shift = shift;
  }
  encrypt(string) {
    return string.toUpperCase().replaceAll(/[A-Z]/g, char => {
      let code = char.charCodeAt(0)   this.shift;
      if(code>90)
        code-=26;
      return String.fromCharCode(code);
    });
  }
}

const cipher = new ShiftCipher(2);
console.log(cipher.encrypt('I love to code z!'));