Список всех символов, которые нужно экранировать перед тем, как поместить в RegEx? - PullRequest
65 голосов
/ 24 февраля 2011

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

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

Ответы [ 6 ]

67 голосов
/ 24 февраля 2011

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

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

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

9 голосов
/ 24 февраля 2011

Согласно этому сайту , список символов для экранирования:

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

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

4 голосов
/ 25 мая 2016

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

[a-z0-9\-_]+

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

[a-z0-9_-]+
3 голосов
/ 26 июля 2017

Исходя из ответа Тату Ульманена, мое решение на C # приняло следующую форму:

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


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

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

0 голосов
/ 21 августа 2018

Проблема:

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, '\\$&')
}
0 голосов
/ 15 декабря 2017

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

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

В javascript символом, который НУЖЕН экранироваться, является синтаксический символ или один из них:

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

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

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

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