Comparez les prix des domaines et des services informatiques des vendeurs du monde entier

Calculer le nombre de coïncidence a regex dans Javascript

Je voulais écrire regex, Calculer le nombre spaces/tabs/newline dans un texte. Par conséquent, j'ai naïvement écrit ce qui suit: -


numSpaces : function/text/ { 
return text.match//\s//.length;
}


Pour des raisons inconnues, il retourne toujours
1

. Quel est le problème avec la déclaration ci-dessus? Depuis lors, j'ai résolu ce problème comme suit: -


numSpaces : function/text/ { 
return /text.split//\s//.length -1/;
}
Invité:

Alice

Confirmation de:

tl;dr: Compteur de modèles total


// THIS IS WHAT YOU NEED
const count = /str/ => {
const re = /YOUR_PATTERN_HERE/g
return //str || ''/.match/re/ || []/.length
}


Pour ceux qui sont arrivés ici à la recherche d'un moyen universel de compter le nombre d'entrées de modèle regex Dans la chaîne, et ne veut pas qu'il échoue s'il y a une entrée nulle, ce code est ce dont vous avez besoin. Voici une telle démonstration:


/*
* Example
*/

const count = /str/ => {
const re = /[a-z]{3}/g
return //str || ''/.match/re/ || []/.length
}

const str1 = 'abc, def, ghi'
const str2 = 'ABC, DEF, GHI'

console.log/`'${str1}' has ${count/str1/} occurrences of pattern '/[a-z]{3}/g'`/
console.log/`'${str2}' has ${count/str2/} occurrences of pattern '/[a-z]{3}/g'`/



Réponse originale

Le problème avec votre code source est que vous manquez
http://www.javascriptkit.com/jsref/regexp.shtml
:


>>> 'hi there how are you'.match//\s/g/.length;
4


Sans
g

les pièces regex Il ne correspondra qu'à la première entrée et s'arrête là-bas.

Notez également que votre regex Envisagerons des espaces successifs deux fois:


>>> 'hi there'.match//\s/g/.length;
2


S'il est indésirable, vous pouvez le faire:


>>> 'hi there'.match//\s+/g/.length;
1

Emilie

Confirmation de:

Comme déjà mentionné dans

, vous pouvez utiliser
https://developer.mozilla.org/ ... /exec
pour le buste de toute coïncidence et comptant chaque entrée; L'avantage n'est limité que par la mémoire, car en général, il s'agit d'environ 20% plus lent que l'utilisation
https://developer.mozilla.org/ ... match
.


var re = /\s/g,
count = 0;

while /re.exec/text/ !== null/ {
++count;
}

return count;

Alice

Confirmation de:

//'a a a'/.match//b/g/ || []/.length; // 0
//'a a a'/.match//a/g/ || []/.length; // 3


Basé sur

, Mais corrigé pour des travaux réels dans le cas de zéro résultats.

Agathe

Confirmation de:

/'my string'.match//\s/g/ || []/.length;

Emilie

Confirmation de:

C'est certainement ce qui a beaucoup de pièges. J'ai travaillé avec la réponse Paolo Bergantino et j'ai compris que même cela avait des limitations. J'ai trouvé un emploi avec des représentations de chaîne de dates un bon endroit pour trouver rapidement certains des principaux problèmes. Démarrer à partir d'une telle ligne d'entrée:
'12-2-2019 5:1:48.670'


et mettre en place la fonction PAOLO comme suit:


function count/re, str/ {
if /typeof re !== "string"/ {
return 0;
}
re = /re === '.'/ ? /'\\' + re/ : re;
var cre = new RegExp/re, 'g'/;
return //str || ''/.match/cre/ || []/.length;
}


Je voulais qu'une expression régulière soit transférée à la fonction pour être plus multiple, deuxièmement, je voulais que le paramètre soit une chaîne de sorte que le client n'ait pas fait regex, Et simplement coïncidé avec une chaîne en tant que méthode standard de classe de service string.

Maintenant, vous pouvez voir que je traite de problèmes de participation. Avec l'aide des moyens suivants:


if /typeof re !== "string"/ {
return 0;
}


Je garantis que l'entrée n'a rien de commun avec les littéraux.
0

,
false

,
undefined

ou
null

, Aucun d'entre eux n'est une chaîne. Étant donné que ces littéraux ne sont pas inclus dans la ligne de saisie, il ne devrait y avoir aucune coïncidence, mais ils doivent coïncider avec
'0'

, qui est une chaîne.

Avec l'aide des moyens suivants:


re = /re === '.'/ ? /'\\' + re/ : re;


Je traite du fait que le concepteur RegExp sera /Je pense mal/ Interpréter la chaîne
'.'

comme All character matcher
\.\


Enfin, depuis que j'utilise le designer RegExp, J'ai besoin de lui donner un drapeau global
'g'

, Afin qu'il prend en compte toutes les coïncidences, et pas seulement les premières, comme des propositions d'autres postes.

Je comprends que c'est une réponse très tardive, mais elle peut être utile pour quelqu'un qui trébuche ici. BTW Voici la version TypeScript:


function count/re: string, str: string/: number {
if /typeof re !== 'string'/ {
return 0;
}
re = /re === '.'/ ? /'\\' + re/ : re;
const cre = new RegExp/re, 'g'/;
return //str || ''/.match/cre/ || []/.length;
}

Alice

Confirmation de:

Que dis-tu de ça


function isint/str/{
if/str.match//\d/g/.length==str.length/{
return true;
}
else {
return false
}
}

Pour répondre aux questions, connectez-vous ou registre