2
votes

ne peut pas comprendre la différence entre les quantificateurs * et + dans REGEX

Je suis nouveau dans regex, et comme j'ai étudié, le * correspond à zéro ou plus et + correspond à un ou plusieurs, donc j'ai commencé à tester ceci:

array(1) {
  [0]=>
  string(1) "a"
}
array(1) {
  [0]=>
  string(0) ""
}
array(1) {
  [0]=>
  string(1) "a"
}

mais le résultat est que * ne correspond à rien et est retourné vide tant que la lettre a existe:

<?php
preg_match("/a/", 'bbba',$m);
preg_match("/a*/", 'bbba',$o);
preg_match("/a+/", 'bbba',$p);
echo '<pre>';
    var_dump($m);
    var_dump($o);
    var_dump($p);
echo '</pre>';  
?>

donc ce qui me manque ici.


3 commentaires

Parce que a * correspond également à vide, c'est pourquoi il affiche un résultat vide


a * correspondait. Il correspondait à zéro "a".


@catcon merci, j'ai transféré vers preg_match_all et maintenant j'obtiens le résultat de chaque étape stockée dans le tableau


3 Réponses :


2
votes

* signifie que l'élément précédent sera mis en correspondance zéro ou plusieurs fois.

+ signifie que l'élément précédent sera mis en correspondance une ou plusieurs fois.

Aussi a * correspond à vide, c'est pourquoi il affiche un résultat vide. Vous pouvez utiliser preg_match_all ("/ a * /", 'bbba', $ o); puis filtrer les résultats sur les valeurs non vides du tableau résultant.


0 commentaires

4
votes

/ a / correspond au premier a dans bbba

/ a * / correspond à 0 ou plusieurs caractères a . Il y a 0 caractère a entre le début de la chaîne et le premier b , donc il y correspond.

/ a + / correspond à 1 ou plusieurs caractères a , donc il correspond au premier a caractère

La chose à noter ici est qu'une expression régulière essaiera de correspondre le plus tôt possible dans la chaîne qu'elle vérifie.


1 commentaires

C'est un comportement «paresseux». Il existe une bonne explication à ce comportement en ce qui concerne les expressions régulières [ici] [1]. [1]: stackoverflow.com/questions/2301285/...



2
votes

a * signifie une chaîne de correspondance qui ne peut PAS contenir a car * correspond à zéro ou plus,
d'où le motif a * correspondra même à une chaîne vide. Pour voir toutes les correspondances, vous pouvez utiliser preg_match_all , comme:

array(1) {
  [0]=>
  array(5) {
    [0]=>
    string(0) ""
    [1]=>
    string(0) ""
    [2]=>
    string(0) ""
    [3]=>
    string(1) "a"
    [4]=>
    string(0) ""
  }
}

comme résultat, vous verrez:

<?php
preg_match_all("/a*/", 'bbba', $o);
var_dump($o);

j'espère que cela vous aidera.


4 commentaires

Merci beaucoup, cette ligne a rendu plus claire la chaîne de correspondance qui ne peut PAS contenir de , qui s'intègre à la réponse de @ JGNI. Merci à vous deux


@MohamedOmar bienvenue à tout moment!)


Je pense que ce sera plus précis si nous disons (correspond à rien ou a). parce que si correspond à une chaîne qui ne peut pas contenir, signifierait correspondre à n'importe quoi, disons b.


Dans le résultat que vous avez montré ici, rien n'est retourné et s'il y en a, mais rien de plus