Подтвердить что ты не робот

Список всех символов, которые должны быть экранированы перед вводом в RegEx?

Может кто-нибудь, пожалуйста, дайте полный список специальных символов, которые должны быть экранированы?

Я боюсь, что не знаю некоторых из них.

4b9b3361

Ответ 1

Взгляните на реализацию PHP.JS функции PHP preg_quote, которая должна делать то, что вам нужно:

http://phpjs.org/functions/preg_quote:491

Специальные символы регулярного выражения: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

Ответ 2

В соответствии с этим сайтом список символов для выхода

[, обратная косая черта \, каретка ^, знак доллара $, период или точка., вертикальная полоса или символ трубы, знак вопроса?, звездочка или звезда *, знак плюса +, открытие круглый кронштейн (и закрывающий круглый кронштейн).

В дополнение к этому вам нужно избежать символов, которые интерпретируются интерпретатором Javascript как конец строки, либо ', либо ".

Ответ 3

Дефис (-) должен быть экранирован, когда он находится в квадратных скобках, и он не расположен в начале или в конце например Необходимо бежать - для

[a-z0-9\-_]+

Не нужно бежать - для

[a-z0-9_-]+

Ответ 4

Основываясь на ответе Тату Ульмана, мое решение в С# получило следующую форму:

private static List<string> RegexSpecialCharacters = new List<string>
{
    "\\",
    ".",
    "+",
    "*",
    "?",
    "[",
    "^",
    "]",
    "$",
    "(",
    ")",
    "{",
    "}",
    "=",
    "!",
    "<",
    ">",
    "|",
    ":",
    "-"
};


foreach (var rgxSpecialChar in RegexSpecialCharacters)
                rgxPattern = input.Replace(rgxSpecialChar, "\\" + rgxSpecialChar);

Обратите внимание, что я переключил позиции "\" и ".", неспособность обработать косые черты сначала приведет к удвоению значения "\"

Ответ 5

Я искал этот список в отношении установки ESLint "no-noeless-escape" для reg-ex. И обнаружил, что некоторые из этих символов не нуждаются в ускорении для регулярного выражения в JS. Более длинный список в другом ответе здесь для PHP, который требует, чтобы дополнительные символы были экранированы.

В эта проблема github для ESLint, примерно на полпути вниз, пользователь not-an-aardvark объясняет, почему персонаж, на который ссылается проблема, является символом, который возможно, может быть экранировано.

В javascript символу, который НЕОБХОДИМО ускользнуть, является символ или один из них:

^ $ \ . * + ? ( ) [ ] { } |

Ответ на проблему github, с которой я связан выше, включает в себя объяснение семантики "Приложение B" (о которой я мало что знаю), которая позволяет исключить 4 из вышеупомянутых символов: ) ] { }.

Еще одна вещь, которую следует отметить, заключается в том, что экранирование символа, который не требует экранирования, не принесет никакого вреда (за исключением, может быть, если вы пытаетесь избежать escape-символа). Итак, мое личное эмпирическое правило: "Когда возникают сомнения, побег"

Ответ 6

Эта проблема:

const character = '+'
new RegExp(character, 'gi') // error

Умные решения:

// with babel-polyfill
// Warning: will be removed from babel-polyfill v7
const character = '+'
const escapeCharacter = RegExp.escape(character)
new RegExp(escapeCharacter, 'gi') // /\+/gi

// ES5
const character = '+'
const escapeCharacter = escapeRegExp(character)
new RegExp(escapeCharacter, 'gi') // /\+/gi

function escapeRegExp(string){
    return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
}