2015-07-31 3 views
1

Я следующий JS кодПонимание некоторые JavaScript с RegExp

var regex = new RegExp('([\'"]?)((?:\\\\\\1|.)+?)\\1(,|$)', 'g'), 
key = regex.exec(m), 
val = regex.exec(m); 

Я хотел бы, чтобы это понять. В частности:

  • почему все те, обратный слэш в определении RegExp? Я ясно вижу, что \\1 является ссылкой на первый сохраненный элемент. Почему в новом RegExp с помощью ", а не" мы должны использовать \\1 и не просто \1?

  • почему запятая между двумя определениями key и val? Я могу предположить, что это зависит от „экземпляров“ finded использованием "g", но это не очень понятно, во всяком случае для меня.

Я попытался выполнить код с

m = 'batman, robin' 

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

Код взят из JQuery Cookbook, 2,12

+0

использования [regexr.com] (HTTP: // regexr.com/), вставьте ваше регулярное выражение в область ** выражения ** сверху, и вы получите объяснение для каждого символа в регулярном выражении. –

+0

Да, я знаю этот сайт, но я до сих пор не могу понять, как поставить все эти обратные косые черты; для меня бесполезно, если нужно просто взять слова, разделенные запятой. Также regexr.com не объясняет, почему есть такие вещи: '\\ 1'. – W4cc0

+0

Шесть обратных косых черт означают 3 обратные косые черты в regex, а 1 матче - символ «1». –

ответ

0

почему все те, обратный слэш в определении RegExp?

"\\" - это строка, значение которой составляет \. Одна обратная косая черта используется как побег, вторая для значения. Затем в пределах регулярного выражения вам также нужно снова свернуть символ обратной косой черты , потому что символы обратной косой черты используются для обозначения особых вещей в регулярном выражении.

Например

"\\1" 

является строкой, значение которого \1, который, в регулярном выражении, соответствует первой захваченное группе.

"\\\\" 

является строкой, значение которого \\, который, в регулярном выражении, соответствует единственному \ характер.

"\\\\\\1" 

является строкой, значение которого \\\1, который, в регулярном выражении, соответствует единственному \ с последующим первой захваченной группой.

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

Почему между двумя определениями ключа и val есть запятая?

Код, который вы отправили, является объявлением переменной. Это легче увидеть, когда отформатирован:

var regex = ..., 
    key = ..., 
    val = ...; 

Каждый из имен переменных в списке объявляются с помощью ключевого слова var. Это то же самое, объявляя ключевые слова отдельно:

var regex, 
    key, 
    val; 

regex = ... 
key = ... 
val = ... 

Что такое же, как объявить каждый вар с другой вар ключевого слова:

var regex = ... 
var key = ... 
var val = ... 
0

Там разница при написании динамических объектов регулярных выражений и статических объектов регулярных выражений. Когда вы инициализируете объект регулярного выражения строкой, его нужно преобразовать в объект регулярного выражения. Однако не только «\» имеет особое значение в объектах регулярных выражений, но также и внутри строк javascript, следовательно, двойной escape.

Редактировать: Что касается второго вопроса. Вы можете сделать несколько объявлений с запятой, например:

var one = 'one', 
    two = 'two', 
    three = 'three'; 

2nd Edit: Вот что происходит с вашей строки, когда он компилирует в объект RegEx.

/(['"]?)((?:\\\1|.)+?)\1(,|$)/g 
0

Регулярное выражение лучше представить в виде регулярных выражений буквального:

var regex = /(['"]?)((?:\\\1|.)+?)\1(,|$)/g; 

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

Обратные косые черты, которые сами по себе не являются частью escape-последовательности, должны быть экранированы, поэтому, если вы хотите совместить только обратную косую черту в тексте, вы должны избегать ее с обратной косой чертой: \\.

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

var regex = new RegExp('([\'"]?)((?:\\\\\\1|.)+?)\\1(,|$)', 'g'), 
Смежные вопросы