Retorna as posições de uma correspondência de expressão regular () em JavaScript?

Existe uma maneira de recuperar as posições de caractere (inicial) dentro de uma seqüência de caracteres dos resultados de uma correspondência de expressão regular () em JavaScript?

    exec retorna um object com uma propriedade de index :

     var match = /bar/.exec("foobar"); if (match) { console.log("match found at " + match.index); } 

    Aqui está o que eu criei:

     // Finds starting and ending positions of quoted text // in double or single quotes with escape char support like \" \' var str = "this is a \"quoted\" string as you can 'read'"; var patt = /'((?:\\.|[^'])*)'|"((?:\\.|[^"])*)"/igm; while (match = patt.exec(str)) { console.log(match.index + ' ' + patt.lastIndex); } 

    De developer.mozilla.org docs no método String .match() :

    A Matriz retornada possui uma propriedade de input extra, que contém a sequência original que foi analisada. Além disso, ele possui uma propriedade de índice, que representa o índice baseado em zero da correspondência na sequência .

    Ao lidar com um regex não-global (ou seja, nenhum sinalizador g no seu regex), o valor retornado por .match() tem uma propriedade de index … tudo que você precisa fazer é acessá-lo.

     var index = str.match(/regex/).index; 

    Aqui está um exemplo mostrando que está funcionando também:

     var str = 'my string here'; var index = str.match(/here/).index; alert(index); // < - 10 

    Você pode usar o método de search do object String . Isso só funcionará para o primeiro jogo, mas fará o que você descreve. Por exemplo:

     "How are you?".search(/are/); // 4 

    Aqui está um recurso legal que eu descobri recentemente, eu tentei isso no console e parece funcionar:

     var text = "border-bottom-left-radius"; var newText = text.replace(/-/g,function(match, index){ return " " + index + " "; }); 

    Que retornou: “borda 6 inferior 13 esquerda 18 raio”

    Então, isso parece ser o que você está procurando.

    Este membro fn retorna uma matriz de posições baseadas em 0, se houver, da palavra de input dentro do object String

     String.prototype.matching_positions = function( _word, _case_sensitive, _whole_words, _multiline ) { /*besides '_word' param, others are flags (0|1)*/ var _match_pattern = "g"+(_case_sensitive?"i":"")+(_multiline?"m":"") ; var _bound = _whole_words ? "\\b" : "" ; var _re = new RegExp( _bound+_word+_bound, _match_pattern ); var _pos = [], _chunk, _index = 0 ; while( true ) { _chunk = _re.exec( this ) ; if ( _chunk == null ) break ; _pos.push( _chunk['index'] ) ; _re.lastIndex = _chunk['index']+1 ; } return _pos ; } 

    Agora tente

     var _sentence = "What do doers want ? What do doers need ?" ; var _word = "do" ; console.log( _sentence.matching_positions( _word, 1, 0, 0 ) ); console.log( _sentence.matching_positions( _word, 1, 1, 0 ) ); 

    Você também pode inserir expressões regulares:

     var _second = "z^2+2z-1" ; console.log( _second.matching_positions( "[0-9]\z+", 0, 0, 0 ) ); 

    Aqui se obtém o índice de posição do termo linear.

     var str = "The rain in SPAIN stays mainly in the plain"; function searchIndex(str, searchValue, isCaseSensitive) { var modifiers = isCaseSensitive ? 'gi' : 'g'; var regExpValue = new RegExp(searchValue, modifiers); var matches = []; var startIndex = 0; var arr = str.match(regExpValue); [].forEach.call(arr, function(element) { startIndex = str.indexOf(element, startIndex); matches.push(startIndex++); }); return matches; } console.log(searchIndex(str, 'ain', true));