Помогите интерпретировать JavaScript Regex - PullRequest
1 голос
/ 17 июля 2009

Я нашел следующее выражение, предназначенное для изменения идентификатора клонированного html-элемента, например, изменить contactDetails[0] на contactDetails[1]:

var nel = 1;
var s = $(this).attr(attribute);
    s.replace(/([^\[]+)\[0\]/, "$1["+nel+"]");
    $(this).attr(attribute, s);

Я не очень хорошо знаком с регулярным выражением, но пытался его интерпретировать и с помощью Regex Coach однако я все еще борюсь. Похоже, что ([^\[]+) соответствует одному или нескольким символам, которые не являются '[', а \[0\]/ соответствует [0]. / в середине я интерпретирую как «включаю оба», поэтому я не понимаю, почему автор даже включил первое выражение.

Я не понимаю, что такое $ 1 в строке замены, и если я использую функциональность замены Regex Coach, если я просто использую [0] в качестве поиска и 1 в качестве замены, я получаю правильный результат, однако, если я изменю javascript на s.replace(/\[0\]/, "["+nel+"]");, строка s останется неизменной.

Буду признателен за любые советы относительно того, что задумал оригинальный автор, и за помощь в поиске решения, которое успешно заменит число в квадратных скобках в любом месте строки поиска.

Ответы [ 8 ]

2 голосов
/ 17 июля 2009

* Найти 1002 *

/           # Signifies the start of a regex expression like " for a string
([^\[]+)    # Capture the character that isn't [ 1 or more times into $1
\[0\]       # Find [0]
/           # Signifies the end of a regex expression

Заменить

"$1["       # Insert the item captured above And [
+nel+       # New index
"]"         # Close with ]

Чтобы создать выражение, которое захватывает любую цифру, вы можете заменить 0 на \d+, который будет соответствовать цифре 1 или более раз.

s.replace(/([^\[]+)\[\d+\]/, "$1["+nel+"]");
2 голосов
/ 17 июля 2009

$1 - это обратная ссылка на первую группу в регулярном выражении. Группы - это кусочки внутри (). Таким образом, в этом случае $1 будет заменено тем, что соответствует ([^\[]+).

Если строка была contactDetails[0], результирующая строка будет contactDetails[1].

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

([^\[]+)\[\d+\]

\d соответствует любому символу цифры. \d+ становится любой последовательностью, состоящей хотя бы из одной цифры.

Но ваш код все равно не будет работать, потому что строки Javascript неизменны. Это означает, что их нельзя изменить после создания. Метод replace возвращает новую строку вместо изменения исходной. Вы должны использовать:

s = s.replace(...)
1 голос
/ 17 июля 2009

похоже, что он заменяет массивы 0 на 1.

Например: массив [0] переходит в массив [1]

Объяснение:

([^ [] +) - эта часть означает сохранение всего, что не является [в переменную $ 1
[0] / - Эта часть ограничивает Часть 1, чтобы сохранить все до [0]

"$ 1 [" + nel + "]" - распечатать содержимое $ 1 (загружено из части 1) и добавить скобки со значением nel. (в вашем примере nel = 1)

0 голосов
/ 17 июля 2009

Ваша интерпретация регулярного выражения верна. Он предназначен для соответствия одному или нескольким символам, которые не являются [, за которыми следует литерал [0]. И используемый в методе replace, совпадение будет заменено на совпадение первой группировки (вот чем заменяется $1) вместе с последовательностью [, за которой следуют значения nel и ] (вот как следует интерпретировать "$1["+nel+"]").

И снова, простой s.replace(/\[0\]/, "["+nel+"]") делает то же самое. За исключением случаев, когда перед [0] ничего нет, потому что в этом случае первое регулярное выражение не найдет соответствия.

0 голосов
/ 17 июля 2009

[^\[] будет соответствовать любому символу, который не [, «+» означает один или несколько раз. Так что [^ [] + будет соответствовать contactDetails. Скобки фиксируют это для последующего использования. Символ '\' является escape-символом, поэтому конец \[0\] будет соответствовать [0]. Строка замены будет использовать $ 1, что было зафиксировано в скобках, и добавит новый индекс.

0 голосов
/ 17 июля 2009

$ 1 является ссылкой на значение первой пары парантезов. В вашем случае значение

[^\[]+

, который соответствует одному или нескольким символам, которые не являются '['

Оставшаяся часть регулярного выражения соответствует строке '[0]'.

Так что если s равно 'foobar [0]', результатом будет 'foobar [1]'.

0 голосов
/ 17 июля 2009

Это регулярное выражение соответствует слову "что-то", за которым следует [0].
«что-то» идентифицируется выражением [^\[]+, которое соответствует всем символам, которые не являются [. Вы можете видеть () вокруг этого выражения, потому что совпадение повторно используется с $ 1, позже. Остальная часть вашего регулярного выражения - то есть \[0\] просто соответствует индексу [0]. Автор должен был написать \[ и \], потому что [и] являются специальными символами для регулярных выражений и должны быть экранированы.

0 голосов
/ 17 июля 2009

Квадратные скобки определяют набор символов для сопоставления. [abc] будет соответствовать буквам a, b или c.

Добавляя карат, вы теперь указываете, что хотите, чтобы персонажей не было в наборе. [^abc] будет соответствовать любому символу, который не является a, b или c.

Поскольку квадратные скобки имеют особое значение в RegExps, вам нужно экранировать их косой чертой, если вы хотите сопоставить их. [ запускает набор символов, \[ соответствует скобке. (Та же концепция для закрытия скобок.)

Итак, [^\[]+ захватывает 1 или более символов, которые не являются [.

Обтекание, которое в скобках «захватывает» совпавшую часть строки (в данном случае «contactDetails», чтобы вы могли использовать ее при замене.

$1 использует "захваченную" строку (т.е. "contactDetails") в строке замены.

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