J'ai du mal à trouver une réponse sur la façon d'utiliser l'expression régulière pour faire correspondre une plage de nombres, mais en excluant un nombre
ie: Je recherche TOUTE correspondance de - AM19 / 0601 - AM19 / 0805 (mais PAS AM19 / 0803)
J'utilise ceci pour voir si j'ai une correspondance sur:
AM19 / 6XX AM19 / 7XX AM19 / 8XX
if (preg_match('/AM19\/0[678]/', $perm) === 0) { //do whatever }
Comme dans:
/AM19\/0[678]
Mais comment «exclure» l'option AM19 / 803 pour ne PAS retourner / ou être inclus dans le match / search?
3 Réponses :
Vous pouvez utiliser une assertion de recherche négative dans votre regex:
~\bAM19/0(?!803)[678]\d{2}\b~
Ici, nous avons un lookahead négatif (?! 803)
après la correspondance 19/0
qui échouera la correspondance si 803
apparaît juste après 19/0
en entrée.
Notez également qu'en utilisant un autre délimiteur d'expression régulière ~
, vous pouvez évitez d'échapper /
dans votre regex.
Qu'est-ce qui a changé depuis votre réponse initiale? Qu'est-ce qui diffère? Et pourquoi? *** ~ AM19 / 0 (?! 803) [678] ~ *** contre *** ~ \ bAM19 / 0 (?! 803) [678] \ d {2} \ b ~ ***
Même si vous utilisez une expression régulière dans mon commentaire, c'est-à-dire ~ AM19 / 0 (?! 803) [678]
, il trouvera toujours le même nombre de correspondances
vous avez raison..Je n'ai PAS défini les indicateurs. Comment puis-je les définir dans mon modèle PHP preg_match maintenant? (au lieu de RegEx101?)
Aucun indicateur nécessaire, utilisez simplement ~ \ bAM19 / 0 (?! 803) [678] \ d {2} \ b ~
dans une fonction preg_match_all
au lieu de preg_match
Vous pouvez utiliser
(?:AM19/0803)(*SKIP)(*FAIL)|AM19/\d+
Ou même
\bAM19/(?!0803)\d+
Ce dernier peut être un peu exagéré, voir une démo sur regex101.com .
Vous n'avez pas besoin d'une anticipation négative ou quoi que ce soit de ce genre. Les crochets peuvent accepter plusieurs plages (comme dans [a-zA-Z]
, par exemple). Vous pouvez simplement ignorer le numéro indésirable en utilisant plusieurs plages de chiffres.
Solution: AM19\/0[6-8[6-8 .[0-9ITED[0-24-9ITED
Regex101: https://regex101.com/r/6Zc6br/ 3
Utiliser une anticipation négative:
~ AM19 / 0 (?! 803) [678] ~
regex101.com est un site Web très utile pour vous aider avec les regex. Peut-être que cela peut vous aider à résoudre votre problème.
J'étais chez RegEx101 .. mais je ne savais pas comment implémenter la recherche négative ... Je le faisais comme ça, ce qui était évidemment une syntaxe incorrecte: "AM19 \ / 0 [678] (?! ^ AM19 \ / 803 $) "
@anubhava Merci pour la réponse ... quand j'ai testé cela dans RegEx101 .. Il semble seulement renvoyer 1 correspondance: AM19 / 0 (?! 803) [678] Exemple de chaîne: AM19 / 0601, AM19 / 0602, AM19 / 0803 Ne devrait-il pas correspondre sur 2? (Je n'ai pas besoin d'un décompte pour être clair ... juste curieux)
@whispers: Vérifiez ma réponse et le lien de démonstration ci-dessous. Il renvoie toutes les autres correspondances très bien. Vous pouvez également voir: regex101.com/r/X0Un7G/2
C'est différent de ce que vous avez posté ci-dessus ... pourquoi? Quelles sont les différences? Et pourquoi utiliser les uns sur les autres?