2
votes

RegEx: plage de numéros sans numéro spécifique

  • Utilisation de PHP
  • 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?


6 commentaires

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?


3 Réponses :


1
votes

Vous pouvez utiliser une assertion de recherche négative dans votre regex:

~\bAM19/0(?!803)[678]\d{2}\b~

Démo RegEx

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.


4 commentaires

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



1
votes

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 .


0 commentaires

1
votes

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


0 commentaires