web-dev-qa-db-fra.com

Renvoie les positions d'un match de regex () en Javascript?

Existe-t-il un moyen de récupérer les positions de caractères (de départ) dans une chaîne des résultats d'une correspondance regex () en Javascript?

122
stagas

Voici ce que je suis venu avec:

// 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);
}
54
stagas

exec retourne un objet avec une propriété index:

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

Et pour plusieurs matches:

var re = /bar/g,
    str = "foobarfoobar";
while ((match = re.exec(str)) != null) {
    console.log("match found at " + match.index);
}
185
Gumbo

De developer.mozilla.org docs sur la méthode String .match():

Le tableau renvoyé a une propriété d'entrée supplémentaire, qui contient la chaîne d'origine analysée. De plus, , il possède une propriété index, qui représente l'index de base zéro de la correspondance dans la chaîne .

Lorsque vous traitez avec une expression rationnelle non globale (c'est-à-dire, aucun indicateur g sur votre expression rationnelle), la valeur renvoyée par .match() a une propriété index ... tout ce que vous avez y faire, c'est y accéder.

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

Voici un exemple montrant que cela fonctionne aussi:

var str = 'my string here';

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

alert(index); // <- 10

J'ai testé avec succès tout cela depuis IE5.

12
Jimbo Jonny

Vous pouvez utiliser la méthode search de l'objet String. Cela ne fonctionnera que pour le premier match, mais fera autrement ce que vous décrivez. Par exemple:

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

Voici une fonctionnalité intéressante que j'ai découverte récemment, que j'ai essayée sur la console et qui semble fonctionner:

var text = "border-bottom-left-radius";

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

Qui a renvoyé: "frontière 6 bas 13 gauche 18 rayon"

Donc, cela semble être ce que vous recherchez.

5
felipeab

Ce membre fn retourne un tableau de positions basées sur 0, le cas échéant, du mot d'entrée dans l'objet 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 ;
}

Essayez maintenant

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 ) );

Vous pouvez également entrer des expressions régulières:

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

Ici, on obtient l'indice de position du terme linéaire.

1
Sandro Rosa
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));
1
Yaroslav