Обратные ссылки регулярных выражений JavaScript возвращают массив совпадений из одной группы захвата (нескольких групп)

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

Я прошел через множество итераций кода, и на самом деле это всего лишь ход мыслей. В какой-то момент я использовал глобальный флаг, я думаю, для того, чтобы матч ()работал, и я не могу вспомнить, нужно ли это сейчас или нет.

var str = "@abc@def@ghi&jkl";
var regex = /^(?:@([a-z]+))?(?:&([a-z]+))?$/;

Идея здесь, в этом упрощенном коде, заключается в том, что необязательная группа 1, количество которой не указано, будет соответствовать @abc, @def и @ghi. Он будет захватывать только альфа-символы, которых будет один или несколько. Группа 2 такая же, за исключением совпадений по символу &. Он также должен быть привязан к началу и концу строки.

Я хочу иметь возможность ссылаться на все совпадения обеих групп, т.е.:

result = str.match(regex);
alert(result[1]); //abc,def,ghi
alert(result[1][0]); //abc
alert(result[1][1]); //def
alert(result[1][2]); //ghi
alert(result[2]); //jkl

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

(кроме того, если сделать любую группу необязательной, это приведет к беспорядку, как и установка глобального флага )

var str = "@abc@def@ghi&jkl";
var regex = /(?:@([a-z]+))(?:&([a-z]+))/;

var result = str.match(regex);

alert(result[1]); //ghi
alert(result[1][0]); //g
alert(result[2]); //jkl

. Ниже приведено решение, к которому я пришел, захватив всю рассматриваемую часть и создав массив самостоятельно:

var str = "@abc@def@ghi&jkl";
var regex = /^([@a-z]+)?(?:&([a-z]+))?$/;

var result = regex.exec(str);

alert(result[1]); //@abc@def@ghi
alert(result[2]); //jkl

var result1 = result[1].toString();
result[1] = result1.split('@')

alert(result[1][1]); //abc
alert(result[1][2]); //def
alert(result[1][3]); //ghi
alert(result[2]); //jkl
5
задан ekad 26 November 2017 в 10:21
поделиться