Понимание регулярных выражений Javascrip / [a-ce-gi-mo-su-y] / - PullRequest
0 голосов
/ 03 апреля 2019

Я сталкивался с этим, / [a-ce-gi-mo-su-y] /, регулярным выражением для решения проблемы с кодербайтом. Я не понимаю, почему это выражение используется, когда / [a-z] / выполняет ту же самую задачу. Кроме того, почему / [zdhnt] / используется отдельно. Спасибо за ваше время.

Полный код:

function LetterChanges(str) {

  str = str.trim().toLowerCase();
  var len = str.length;
  var newStr = '';

  for (var i = 0; i < len; i++) {
    if (/[a-ce-gi-mo-su-y]/.test(str[i])) {
        newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) + 97)    
    }
    else if (/[zdhnt]/.test(str[i])) {
        newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) + 65);
    }
    else {
     newStr += str[i]; 
    }
  }
    return newStr; 

}

Ответы [ 3 ]

1 голос
/ 03 апреля 2019

Функция, очевидно, хочет создать строку из строчных и прописных букв, в зависимости от вводимых символов. Когда они являются одним из dhntz, на выходе выдается заглавная буква (начиная с кода ASCII 65), а для всех остальных букв - строчная буква (начиная с кода ASCII 97). Не-буквы остаются нетронутыми.

Если бы условия if были поменяны местами, он мог бы использовать [a-z]. Вот так:

if (/[zdhnt]/.test(str[i])) {
    newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) + 65);
}
else if (/[a-z]/.test(str[i])) {
    newStr += String.fromCharCode(((str[i].charCodeAt(0) - 18) % 26) + 97)    
}

Но кодер выбрал другой путь и сначала проверил наличие букв, которые не являются специальными символами. Таким образом, это объединение диапазонов, которое эквивалентно более длинному:

/[a-c]|[e-g]|[i-m]|[o-s]|[u-y]/

Жаль, что в коде есть некоторое повторение кода при использовании выражения String.fromCharCode.

То же самое может быть достигнуто так:

function LetterChanges(str) {
    return str.trim().toLowerCase().replace(/([zdhnt])|[a-z]/g, (m, toCapital) =>
        String.fromCharCode(((m.charCodeAt(0) - 18) % 26) + (toCapital ? 65 : 97))
    );
}

console.log(LetterChanges("abcdefghijk"));

Здесь метод replace используется с аргументом обратного вызова. Соответствующий символ будет аргументом m, и если совпадение было в группе захвата (([zdhnt])), то toCaptital также будет тем же значением, в противном случае оно будет пустым. Тройное выражение делает все остальное.

1 голос
/ 03 апреля 2019

/[a-ce-gi-mo-su-y]/ не совпадает с /[a-z]/.Первый содержит 5 диапазонов символов: a-c, e-g, i-m, o-s, u-y.Это не будет соответствовать буквам d, h, n, t, z.

Буквы d, h, n, t, z предшествуют гласным e, i, o, u, a;которые должны обрабатываться по-разному в упомянутой вами проблеме (после замены измените гласные на прописные).

0 голосов
/ 03 апреля 2019

Проверить этот сайт: https://regex101.com/tests Он обеспечивает анализ выражений RegEx - и много других функций, таких как добавление модульных тестов для тестирования / демонстрации вашего RegEx, чтобы убедиться, что он работает.

Сайт предоставил это объяснение вашего вопроса:

[a-ce-gi-mo-su-y]
a-c a single character in the range between a (index 97) and c (index 99) (case sensitive)
e-g a single character in the range between e (index 101) and g (index 103) (case sensitive)
i-m a single character in the range between i (index 105) and m (index 109) (case sensitive)
o-s a single character in the range between o (index 111) and s (index 115) (case sensitive)
u-y a single character in the range between u (index 117) and y (index 121) (case sensitive)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...