2010-11-23 24 views
2

J'écris un script PHP et je suis à ce stade où j'ai besoin de savoir si une chaîne se compose d'un caractère qui est juste répété. Le personnage est même spécifique: c'est z.Utilisez regex pour savoir si une chaîne n'est qu'un seul caractère répété

Par exemple, je veux correspondre "z", "zzz" ou "zzzzzzzzz" mais pas "zaz" ou "aaa".

Ceci est probablement une simple question regex, mais je n'ai aucune idée de comment faire cela. N'importe qui?

+6

Vous avez vraiment * pas * idée du tout ? – Gumbo

+0

Gumbo: Je suis allé jusqu'à '[z] +' mais cela semble correspondre à n'importe quelle chaîne avec plus d'un 'z' consécutif. – alfonso

+0

Mais c'est un bon point de départ. Vous auriez pu poser une question plus spécifique basée sur le fait que "[z] +" correspond à toute chaîne qui contient juste un ou plusieurs 'z'; comment faire correspondre une chaîne qui se compose de «z» seulement? » – Gumbo

Répondre

2

match avec ^z*$: commencer (^), une quantité de (z le *) de z, fin ($)

+3

Devrait être« + », pas' * '. – cdhowie

+2

Dépend du résultat que vous voulez pour une chaîne vide. – Joost

+4

Il devrait être '^ zz + $' puisque, pour qu'il soit répété, il doit arriver> = 2 fois. –

0

Vous pouvez créer une fonction personnalisée comme ceci:

function oneLetter($str){ 

    for($i=1; $i < strlen($str); $i++){ 
    if($str[i] != $str[i-1]) return false; 
    } 

    return true; 

} 
+0

Damn. Je n'ai même pas remarqué qu'il s'agissait d'un personnage spécifique ... – Harmen

+0

Je pensais à ça aussi, mais ça n'avait pas l'air d'être une très bonne solution ... – alfonso

+2

Même pour le problème plus difficile, '/<(.)\1* $/'ou'/^ (?: (.) ​​\ 1 *)? $/'fonctionnerait bien. – aschepler

2

^zz+$

..... la la 15 caractères

+0

parfois la limite de caractères va à l'encontre de la brièveté. – Keng

+0

@PP: C'est bien, 'z' peut correspondre aussi. Je veux juste toutes les chaînes qui ne consistent qu'en 'z', donc en incluant' z' lui-même. – alfonso

1

Si regex vous fait peur - vous pouvez utiliser une fonction comme Harmen proposée ou quelque chose comme:

$string = 'zzzzzzzzz'; 
$check = str_repeat('z', strlen($string)); 
var_dump($check == $string); // dumps bool(true) 

$string = 'zzzzAAAzzz'; 
$check = str_repeat('z', strlen($string)); 
var_dump($check == $string); // dumps bool(false) 
+2

Encore plus facile: 'str_replace ('z', '', $ chaîne) == ''' – Joost

+0

Merci Mikhail et JoostK. J'aime particulièrement la solution de JoostK :) – alfonso

+1

Sneaky joostK :) Ensuite, nous pouvons réduire encore plus loin à '! Str_replace ('z', '', $ chaîne)' – Mikhail

1

Aucune expression régulière nécessaire. Exploiter la puissance des tableaux de PHP:

count(array_unique(str_split($string)))==1 
+0

ne sont pas des tableaux plus de processeur intensif qu'une recherche regex? – Keng

+0

@Keng: Même si elle était plus lente et si nous ne parlons pas de 10 000 itérations, la différence sera insignifiante – stillstanding

+0

Bon à savoir. Merci – Keng

1

Quand je vérifie si une chaîne est juste le même caractère répéter, je le faire:

if (strlen(count_chars($string, 3)) = 1) return true;