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


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

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

6 58

6 ответов:

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

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

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

по данным этот сайт, список символов для побега

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

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

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

[a-z0-9\-_]+

нет необходимости бежать-для

[a-z0-9_-]+

на основе ответа тату Ulmanen, мое решение на C# взял такой форме:

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


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

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

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

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

в javascript символ, который должен быть экранирован, является синтаксис символов, или один из этих:

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

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

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

проблема:

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

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

// ES2016
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, '\$&')
}