8
votes

JavaScript Regex pour compter les caractères blancheurs

Puis-je utiliser une regex JavaScript pour compter le nombre de caractères blancheurs avant le premier caractère de texte de la chaîne? Je me soucie seulement s'il y a 0, 1 et 2 +.

Ma solution de travail actuelle consiste à avoir trois regexes et simplement à utiliser une correspondance pour déterminer la catégorie 0,1 ou plus de 2+ (modèle séparé pour chacun), mais je recherche une solution plus élégante.

Est-il même possible de compter les modèles avec regex? Je pourrais utiliser un groupement non gourmand et compter la longueur, je suppose ...


1 commentaires

Est-ce que 2+ signifie deux ou plus? Est-ce votre intention de produire un compte pour chaque type de chaîne?


6 Réponses :


8
votes
"     a".match(/^\s{0,2}/)[0].length
This regex matches between 0 and 2 whitespace characters at the beginning of a string.

5 commentaires

Pourquoi pas theString.match (/ ^ \ s + /) [0] .Longueur - Le PO signifie, je pense que 2+ signifie deux ou plus, bien que c'était étrangement libellé.


@Ray: Cela ressemble à il n'y a que trois catégories.


Correct, seulement trois catégories: 0, 1 ou 2+. J'ai aussi besoin de tout obtenir après les principaux espaces bleus, comme une garniture Java.


Java Coup str.replace (/ ^ \ s * (. *?) \ s * $ /, "1 $ 1")


@Slaks oh mon mauvais. Je voulais dire \ s * au fait. Bonne réponse!!



0
votes

Cela devrait faire le travail: xxx

exemple: http: // jsfiddle.net/nc3sss/1/


0 commentaires

4
votes

Vous pouvez simplement faire:

"   aaa".replace(/^(\s*).*$/,"$1").length


1 commentaires

Ne semble pas fonctionner quand il y a zéro espaces initiaux - il retourne la longueur de l'ensemble du mot.



3
votes

Je ne suis pas sûr que je n'utiliserais pas une regex dans la vie réelle pour ce travail, mais vous pouvez les faire correspondre dans une capture et le voir leur longueur:

function countLeadingSpaces2(str) {
    for (var i = 0; i < str.length; i++) {
        if (str[i] != " " && str[i] != "\t") {
            return(i);
        }
    }
    return(str.length);
}


5 commentaires

Pourquoi ne pas utiliser \ s * et se débarrasser des "matchs" vérifier complètement?


/ ^ (\ s *) [^ \ t] / d'une chaîne vide renvoie NULL, ce qui signifie que vous ne pouvez pas directement la désarférence [1] longueur sur une correspondance à l'aide de il sans une sorte de chèque. Je ne suggère pas que ma méthode est la plus compacte, mais j'essayais d'être en sécurité pour tous les cas de bord.


Aah, je vois - mais je pense que cela retourne null car il ne peut pas trouver le [\ t] bit. Depuis que les regex sont gourmands quand même, vous pouvez simplement utiliser ^ (\ s *) seul.


Tu as raison. J'ai mis à jour la réponse. Cela finit par quelque chose de similaire à ce que les autres personnes ont.


Mais succinct et réutilisable, donc +1 pour ça :-)



0
votes

Pourquoi pas em> utiliser simplement un groupe de capture et vérifier la longueur:

<html>
    <head>
    </head>
    <body>
        <script language="javascript">
            var myStr = "  hello";
            var myRe = /^(\s*)(.*)$/;
            var match = myRe.exec(myStr);
            alert(match[1].length);  // gives 2
            alert(match[2]);         // gives "hello"
        </script>
    </body>
</html


0 commentaires

2
votes

Vous pouvez trouver l'index du premier caractère non espace de la chaîne, Quel est le même que le nombre de principaux caractères blanches.

t.search(/\S/);


0 commentaires