Доступ к нескольким захватам в RegEx (новичок)

в этом многократном захвате регулярного выражения я должен добавить флаг "g", чтобы получить все элементы...

"aaa bbb ccc \n.000.\n \n.111.\n sd555 dsf \n.222.\n ddd ".match( /^.(.*).$/gm )

когда я добавляю флаг "g" (глобальный)? Как получить доступ к захваченным группам... должно быть 3 типа ["000", "111", "222"], но я не знаю, как получить к ним доступ. .. Я продолжаю получать [".000.", ".111.", ".222."] ‹‹ обратите внимание на точки до и после слов


person ZEE    schedule 07.06.2012    source источник
comment
в чем вопрос? вам нужно 3 цифры или 3 буквы или что-то еще из строки?   -  person micnic    schedule 08.06.2012


Ответы (3)


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

var myregex = /^.(.*).$/gm;
var result, allMatches = [];
while((result = myregex.exec(mystring)) != null) {
    var match = result[1]; // get the first match pattern of this match
    allMatches.push(match);
}

С глобальным регулярным выражением match возвращает массив всех совпадений и никогда не возвращает группы захвата. exec возвращает одно совпадение и все его группы захвата. Чтобы получить все совпадения, вы должны вызвать exec несколько раз, пока он наконец не вернет null.

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

while((result = /^.(.*).$/gm.exec(mystring)) != null) // BAD and WRONG!

Это неправильно, потому что в каждом цикле есть новое регулярное выражение, которое не знает, какое совпадение должно возвращать этот цикл. (Или, точнее, он не знает lastIndex предыдущего регулярного выражения.)

person apsillers    schedule 07.06.2012

В FireBug:

var hello = "aaa bbb ccc \n.000.\n \n.111.\n sd555 dsf \n.222.\n ddd ".match( /^.(.*).$/gm );
console.dir(hello);

Затем вы можете использовать hello[n], где n — это нужное вам совпадение, например `hello[1].

Однако вам нужно изменить регулярное выражение, если вы только хотите сопоставить определенные вещи.

person LeonardChallis    schedule 07.06.2012
comment
Я знаю, что вопрос заключался в том, как сделать захват с помощью (.*) в выражении регулярного выражения - person ZEE; 08.06.2012

Возвращаемый результат от str.match( re ) представляет собой массив.

Демо здесь. http://jsfiddle.net/rXgQa/

var re = /^.(.*).$/gm;
var str = "aaa bbb ccc \n.000.\n \n.111.\n sd555 dsf \n.222.\n ddd ";
var matches = str.match( re );
if( matches ){
    document.body.innerHTML += matches.join( '<br/> ' );
}​

Выходы:

aaa bbb ccc // matches[0]
.000.     // matches[1]
.111.     // matches[2]
sd555 dsf // matches[3]
.222.     // matches[4]
ddd       // matches[5]

Обновлять

Вот мой ответ на вторую часть вопроса. Вопрос: Как избавиться от точки перед и после цифр?

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

Обновленный пример jsfiddle: http://jsfiddle.net/rXgQa/1/

var re = /^\.([^\.]+)\.$/gm;
var lines = "aaa bbb ccc \n.000.\n \n.111.\n sd555 dsf \n.222.\n ddd ";
var matches = lines.match( re );
var i = (matches||[]).length;
while( i-- ){
    matches[i] = matches[i].replace( /\./g, '' );
}

document.body.innerHTML += matches.join( '<br/>' );
person Larry Battle    schedule 07.06.2012
comment
Хорошо, Ларри, но обратите внимание... захват, сделанный (.*) в выражении регулярного выражения, должен убрать точки... и я должен получить [000, 111, 222], а не [.000., . 111., .222.] - person ZEE; 08.06.2012
comment
Хорошо... моя надежда сделать это сразу исчезает... Я буду придерживаться удаления точек после... ;-) - person ZEE; 08.06.2012