Что делает RegExp.
Я столкнулся с фрагментом кода в JScript:
RegExp.$1
Кто-нибудь знает, что он делает?
Если я вывожу его сам по себе, я не получаю ничего, даже ошибки.
Я не могу найти ссылку на него http://www.w3schools.com/jsref/jsref_obj_regexp.asp
Был найден регулярный поиск непосредственно перед этим фрагментом кода, который, как я подозреваю, имеет к нему какое-то отношение:
.search(/^__product\[(.+)\]$/)
Ответы
Ответ 1
Литеральное выражение RegExp.$1
даст вам значение первой группы захвата последнего регулярного выражения. Каким бы ни было это регулярное выражение.
Например:
var match = /_(.*)_/.exec('_test_');
var newMatch = '123-abc'.match(/(\d*)-(\w*)/);
var num = RegExp.$1; // '123';
RegExp.$1
доступен по всему миру, поэтому к нему можно получить доступ из любой точки вашей страницы, независимо от того, где выполнялось само регулярное выражение.
Я никогда не видел этот синтаксис, используемый перед тем, как увидеть этот вопрос, и я бы не предложил его использовать, поскольку я не могу найти документацию на нем. Кроме того, любое регулярное выражение запускается на вашей странице, вне зависимости от того, где будет изменено это свойство. Если вы хотите получить группы захвата, я бы использовал массивы, возвращенные из String.match
или RegExp.exec
.
EDIT: Я нашел документацию об этом: http://msdn.microsoft.com/en-us/library/ie/24th3sah(v=vs.94).aspx
EDIT 2: я нашел дополнительную информацию об этом: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features#RegExp_Properties
RegExp.$1
устарел. Это означает, что будущие браузеры могут удалить эту "функцию", поэтому я предлагаю не использовать ее.
Ответ 2
$1
вернет первую группу, которая соответствует регулярному выражению.
В вашем примере значение, хранящееся в $1
, соответствует всем .+
Группа обозначается скобками, и вы можете иметь кратность. Каждая сохраненная группа будет просто увеличивать цифру с помощью $
, т.е. $1, $2, $3...
Пример:
Если ваш вход был __product[Version 12 Coupe]
, то $1
будет содержать Version 12 Coupe
Ответ 3
Они работают вместе с захватами круглых скобок. Например, /(foo)/
соответствует и запоминает "foo" в "foo bar". Соответствующая подстрока может быть вызвана из результирующих элементов массива [1],..., [n] или из предопределенных свойств объекта RegExp $1,..., $9.
В вашем примере $1
ссылается на соответствие, сделанное (.+)
См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
Ответ 4
$1
- это то, что соответствует первому захвату. Если у вас больше захватов, вы можете использовать $2
, $3
и т.д.
Пример:
"abc".replace(/(.)/, "$1$1"); // aabc
"abc".replace(/(.{2})/, "$1$1"); // ababc
"abc".replace(/(.)(.)/, "$2$1"); // bac
Ответ 5
Как уже говорилось ранее, эти конструкции называются захватами групп скобок, и они в основном используются для ссылки на совпадения, сохраненные/сохраненные после успешного выполнения связанной с RegExp операции.
Кроме того, как было сказано ранее, я не советую использовать их в вашем коде, если не будет обеспечена хорошо контролируемая среда/контекст, например, тот, который предоставляется встроенным методом replace()
, найденным на объекте String.prototype
.
Ответ 6
Чтобы добавить некоторые детали:
(Как уже говорилось,) RegExp.$n
-property (где n
- это одна цифра 1-9) возвращает последнюю подстроку n
th в скобках (захваченных) в совпадении,
Эти свойства были впервые реализованы в JavaScript 1.2 и устарели в JavaScript 1.5 - когда RegExp
претерпело существенное изменение, и многие результаты из RegExp.prototype.exec(string)
были перенесены из объекта RegExp
в экземпляр RegExp
и все свойства .$
(и их версии с полным именем (кроме .multiline
)) "ушли".
нестандартный 1$1
, $2
, $3
, $4
, $5
, $6
, $7
, $8
, $9
свойства статические и только для чтения свойства регулярных выражений (которые содержат совпадающие подстроки в скобках) и изменяются при каждом успешном совпадении.
Они не являются свойствами отдельного объекта регулярного выражения. Вместо этого вы всегда используете их как RegExp.$1
,..., RegExp.$9
.
Количество возможных подстрок в скобках неограниченно (конечно), но объект RegExp
может содержать только последние девять.
1 Нестандартно = не является частью любой текущей спецификации!
Вы можете найти определение и ссылки в следующих разделах ECMA-262 3 Характеристики:
- 15.5.4.10 -
String.prototype.match(regexp)
- 15.5.4.11 -
String.prototype.replace(regexp)
- 15.10.2.1 - Обозначение объекта RegExp NCapturingParens
- 15.10.6.2 -
RegExp.prototype.exec(string)