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