Может кто-нибудь, пожалуйста, дайте полный список специальных символов, которые должны быть экранированы?
Я боюсь, что не знаю некоторых из них.
Может кто-нибудь, пожалуйста, дайте полный список специальных символов, которые должны быть экранированы?
Я боюсь, что не знаю некоторых из них.
Взгляните на реализацию PHP.JS функции PHP preg_quote
, которая должна делать то, что вам нужно:
Специальные символы регулярного выражения: . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
В соответствии с этим сайтом список символов для выхода
[, обратная косая черта \, каретка ^, знак доллара $, период или точка., вертикальная полоса или символ трубы, знак вопроса?, звездочка или звезда *, знак плюса +, открытие круглый кронштейн (и закрывающий круглый кронштейн).
В дополнение к этому вам нужно избежать символов, которые интерпретируются интерпретатором Javascript как конец строки, либо '
, либо "
.
Дефис (-) должен быть экранирован, когда он находится в квадратных скобках, и он не расположен в начале или в конце например Необходимо бежать - для
[a-z0-9\-_]+
Не нужно бежать - для
[a-z0-9_-]+
Основываясь на ответе Тату Ульмана, мое решение в С# получило следующую форму:
private static List<string> RegexSpecialCharacters = new List<string>
{
"\\",
".",
"+",
"*",
"?",
"[",
"^",
"]",
"$",
"(",
")",
"{",
"}",
"=",
"!",
"<",
">",
"|",
":",
"-"
};
foreach (var rgxSpecialChar in RegexSpecialCharacters)
rgxPattern = input.Replace(rgxSpecialChar, "\\" + rgxSpecialChar);
Обратите внимание, что я переключил позиции "\" и ".", неспособность обработать косые черты сначала приведет к удвоению значения "\"
Я искал этот список в отношении установки ESLint "no-noeless-escape" для reg-ex. И обнаружил, что некоторые из этих символов не нуждаются в ускорении для регулярного выражения в JS. Более длинный список в другом ответе здесь для PHP, который требует, чтобы дополнительные символы были экранированы.
В эта проблема github для ESLint, примерно на полпути вниз, пользователь not-an-aardvark
объясняет, почему персонаж, на который ссылается проблема, является символом, который возможно, может быть экранировано.
В javascript символу, который НЕОБХОДИМО ускользнуть, является символ или один из них:
^ $ \ . * + ? ( ) [ ] { } |
Ответ на проблему github, с которой я связан выше, включает в себя объяснение семантики "Приложение B" (о которой я мало что знаю), которая позволяет исключить 4 из вышеупомянутых символов: ) ] { }
.
Еще одна вещь, которую следует отметить, заключается в том, что экранирование символа, который не требует экранирования, не принесет никакого вреда (за исключением, может быть, если вы пытаетесь избежать escape-символа). Итак, мое личное эмпирическое правило: "Когда возникают сомнения, побег"
Эта проблема:
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, '\\$&')
}