Я читаю книгу Sitepoints 2007 года "Просто JavaScript", и я встретился с некоторым кодом, который я просто не могу понять.
Это - следующий код:
Core.removeClass = function(target, theClass)
{
var pattern = new RegExp("(^| )" + theClass + "( |$)");
target.className = target.className.replace(pattern, "$1");
target.className = target.className.replace(/ $/, "");
};
Первый вызов к методу замены - то, что озадачивает меня, я не понимаю, куда значение "за 1$" прибывает из или что это означает. Я думал бы, что вызов должен заменить найденный шаблон "".
Каждая пара круглых скобок (
...)
, где первый символ не является ?
*, является "группой захвата", которая помещает свой результат в $1
,$2
,$3
и т.д., которые могут быть использованы в шаблоне замены.
Вы также можете увидеть то же самое, что и \1
, \2
, \3
в других системах regex, (или иногда в оригинальном выражении, для повторения)
Это называется "обратные ссылки", потому что они обычно ссылаются на (более раннюю) часть выражения.
(* ?
указывает на различные формы специального поведения, включая группу без захвата, которая является (?:
...)
и просто группы без захвата.)
В вашем конкретном примере $1 будет группой (^| )
, которая является "позицией начала строки (нулевой ширины), или одним символом пробела".
Таким образом, заменяя все выражение на это, вы, по сути, удаляете переменную theClass
и потенциально пробел после нее. (Завершающее выражение ( |$)
является обратным - пробел или конечная позиция строки - и поскольку его значение не используется, вместо него можно было бы не использовать (?: |$)
.)
Надеюсь, это все хорошо объясняет - дайте мне знать, если вам нужна дополнительная информация.
Также, вот некоторые дополнительные материалы с сайта regular-expressions.info:
$1 - это обратная ссылка. Она будет заменена на любую первую совпадающую группу (набор скобок) в вашем regex.