Ответ 1
Регулярное выражение
/\([^()]+\)|[^()]+/g
В основном говорит: Есть два варианта: match (1) \([^()]+\)
или (2) [^()]+
, где бы вы ни находились (/g
).
Позвольте перебирать строку с образцом, чтобы вы определили причину полученного результата.
Начальная строка: button:not([DISABLED])
.
- Курсор начинается с char
b
(на самом деле он начинается с якоря начала строки,^
, но для этого примера это не имеет значения). - Между двумя доступными параметрами
b
может соответствовать только (2), так как (1) требует запуска(
.- Теперь, когда он начал сопоставляться с (2), он пройдет весь путь, то есть будет потреблять все, что не является
(
или)
. - Из вышеприведенного элемента он потребляет все до
t
char (потому что следующий(
и не соответствует[^()]+
), таким образом оставляяbutton:not
в качестве первой согласованной строки.
- Теперь, когда он начал сопоставляться с (2), он пройдет весь путь, то есть будет потреблять все, что не является
- (комната для ясности)
- Теперь курсор находится в
(
. Он начинает соответствовать любому из вариантов? Да, первый:\([^()]+\)
.- Опять же, теперь, когда он начал соответствовать (1), он пройдет весь путь, то есть будет потреблять все, что не является
(
или)
до, он находит)
(если при потреблении он находит(
до)
, он будет возвращаться, поскольку это будет означать, что регулярное выражение (1) не было согласовано). - Теперь он потребляет все остальные символы, пока не найдет
)
, , а затем([DISABLED])
в качестве второй строки с согласованием.
- Опять же, теперь, когда он начал соответствовать (1), он пройдет весь путь, то есть будет потреблять все, что не является
- (комната для ясности)
- Поскольку мы достигли последнего символа, обработка регулярного выражения заканчивается.
Изменить: Там очень полезный онлайн-инструмент, который позволяет вам видеть регулярное выражение в графической форме. Может быть, это помогает понять, как будет работать регулярное выражение:
Вы также можете переместить курсор шаг за шагом и посмотреть, что я пытался объяснить выше: прямая ссылка.
Обратите внимание на приоритет выражений, разделенных символом |
:. В связи с тем, как движок JavaScript regex обрабатывает строки, порядок, в котором эти выражения кажутся важными. Он будет оценивать каждую альтернативу в том порядке, в котором они указаны. Если один из этих параметров согласован до конца, он не будет пытаться сопоставить любой другой вариант, даже если это возможно. Надеемся, что пример упростит:
"aaa".match(/a|aa|aaa/g); // ==> ["a", "a", "a"]
"aaa".match(/aa|aaa|a/g); // ==> ["aa", "a"]
"aaa".match(/aaa|a|aa/g); // ==> ["aaa"]