Экранирование одинарных кавычек регулярных выражений создает дополнительные обратные косые черты при repl.it

#javascript #regex #string #replace

#javascript #регулярное выражение #строка #заменить

Вопрос:

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

Я проверил вики регулярных выражений и попытался реализовать решения нескольких вопросов, связанных с регулярными выражениями, но, похоже, я все еще что-то упускаю. Во всех моих попытках мне не удалось «избежать escape», как показано ниже:

     String.prototype.escapeQuote = function () {
        const regex = /'/g;
        const str = `${this}`;
        const subst = `\'`;
        const result = str.replace(regex, subst);
        return resu<
    };

    var str = "this method doesn't work...";
    str.escapeQuote();
  

Когда я запускаю этот код, я ожидаю, что результат будет:

 this method doesn't work...
  

Но результат, который я получаю, когда запускаю его repl.it является:

 'this method doesn\'t work...'
  

привязка subst к ' or просто ' не работает (возможно, это само собой разумеется) — в любом случае результат:

 'this method doesn't work...'
  

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

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

1. Я не совсем понимаю, чего вы на самом деле хотите достичь. Вы пытаетесь префиксить каждый отдельный апостроф тремя символами косой черты?

2. нет, я пытаюсь вернуть строку без

3. Вы исказили экранирование в синтаксисе комментария stackoverflow. Попробуйте описать это, используя имена символов.

4. «Без символов косой черты»? Но ваш пример ввода не содержит никаких символов косой черты для начала.

5. Это артефакт рендеринга того, как используемый вами REPL представляет строку, когда он отображает строку в результате оценки вашего кода (обратите внимание, что он также окружает ее ' символами, разделяющими строку). В самой строке нет косых черт. jsfiddle.net/tcef1kju/1 (Я думаю, что ваш вопрос основан на ложной предпосылке, и вам было бы лучше удалить его).

Ответ №1:

Это артефакт рендеринга того, как используемый вами REPL представляет строку, когда он отображает строку в результате оценки вашего кода.

Обратите внимание, что он также обертывает его, ' чтобы указать, что это строка.

В самой строке нет косых черт, что вы можете видеть в этом примере:

 String.prototype.escapeQuote = function() {
  const regex = /(')/g;
  const subst = `\'`;
  const result = this.replace(regex, subst);
  return resu<
};

const str = `doesn't this sound awesome`;
alert(str   "nn"   str.escapeQuote());  

Ответ №2:

Вы должны использовать неэкранированную строку внутри регулярного выражения.

Вот так:

 String.prototype.escapeQuote = function(){
    return this.replace(/'/g, '\'');
}

console.log("Try it, it's easier!".escapeQuote());  

Если вам это не нравится '\'' , вы можете использовать "\'" вместо этого.

Надеюсь, это сработает для вас.


Если вы хотите экранировать как одинарные, так и двойные кавычки, вы можете использовать это:

 String.prototype.escapeQuotes = function(){
    return this.replace(/["']/g, '\$amp;');
}

console.log("Try it, it's easier!".escapeQuotes());  

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

1. @ZacCollier Извините за огромную задержку. Я был чрезвычайно занят. Я исправил ответ.