#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!'));