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?
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);
}
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);
}
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.
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
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.
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.
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));