Самая большая проблема зная, что вы смотрите на сбежавшего кронштейне (\[
) или кронштейн, который следует сбежавшего обратной косой черты (\\[
). Это достаточно просто, если вы ищете только для одного матча:
/^[^\]\[\\]*(?:\\.[^\]\[\\]*)*(\[[^\]\[]+\])/
Первая часть проглатывает любые другие, чем обратные косая черта или квадратные скобки символов. Если он видит обратную косую черту, он захватывает это и следующий символ, каким бы он ни был. Он повторяет этот процесс столько раз, сколько может, и когда он больше не может этого сделать, следующая вещь должна быть заключенной в квадратные скобки (или «тегом»), которую вы ищете. Он зафиксирован в группе №1.
Получение остальных тегов сложнее. Чтобы оставаться в синхронизации с данными, вы хотите, чтобы каждое последующее совпадение начиналось точно там, где предыдущий матч остался. Многие ароматы регулярных выражений поддерживают якорь \G
для этой цели, но это нам не помогает. JavaScript находится в процессе принятия флага /y
, что делает практически то же самое, но пока вы не можете рассчитывать на это.
Вот обходной путь, который должен работать в случае:
/(?:^|\[[^\]\[]+\])[^\]\[\\]*(?:\\.[^\]\[\\]*)*(?=(\[[^\]\[]+\]))/g
Ядро регулярное выражение то же самое, но группа захвата теперь внутри опережающего просмотра. В первый раз он начинает сопоставляться в начале строки, как и раньше, но он останавливается чуть ниже первого тега.Взгляд подтверждает, что тег присутствует, но не потребляет его. Следующий матч начинается с повторного сопоставления тега, на этот раз его потребляя. Между тем, тег также фиксируется в группе №1, поэтому вы можете получить к нему доступ обычным способом.
var regex = /(?:^|\[[^\]\[]+\])[^\]\[\\]*(?:\\.[^\]\[\\]*)*(?=(\[[^\]\[]+\]))/g;
var match = regex.exec(subject);
while (match != null) {
// tag is in match[1]
match = regex.exec(subject);
}
Почему бы не использовать литералы регулярных выражений, чтобы создать регулярное выражение, чтобы избежать двойного выхода из обратных косых черт? '/\[.*\]/ g' – hugomg