RegEx pour exclure une constante de chaîne spécifique

L’expression régulière peut-elle être utilisée pour faire correspondre une chaîne, à l’exception d’une constante de chaîne spécifique, disons “ABC”? Est-ce possible d’exclure une seule chaîne spécifique constante? Merci d’avance à votre aide.

    Vous devez utiliser une assertion négative.

    (?!^ABC$) 

    Vous pouvez par exemple utiliser les éléments suivants.

     (?!^ABC$)(^.*$) 

    Si cela ne fonctionne pas dans votre éditeur, essayez ceci. Il est testé pour fonctionner en ruby ​​et javascript:

     ^((?!ABC).)*$ 

    Ce n’est pas facile, à moins que votre moteur d’expressions rationnelles n’ait un support spécial pour cela. Le plus simple serait d’utiliser une option de correspondance négative, par exemple:

     $var !~ /^foo$/ or die "too much foo"; 

    Sinon, vous devez faire quelque chose de mal:

     $var =~ /^(($)|([^f].*)|(f[^o].*)|(fo[^o].*)|(foo.+))$/ or die "too much foo"; 

    Celui-ci dit en gros “si ça commence par non- f , le rest peut être n’importe quoi; s’il commence par f , non- o , le rest peut être n’importe quoi; o “.

    Dans .NET, vous pouvez utiliser le regroupement comme suit:

    http://regexhero.net/tester/?id=65b32601-2326-4ece-912b-6dcefd883f31

    Vous remarquerez que:

     (ABC)|(.) 

    Va tout saisir sauf ABC dans le 2e groupe. La parenthèse entoure chaque groupe. So (ABC) est le groupe 1 et (.) Est le groupe 2.

    Donc, vous venez de saisir le 2ème groupe comme celui-ci dans un remplacement:

     $2 

    Ou, dans .NET, examinez la collection Groups dans la classe Regex pour un peu plus de contrôle.

    Vous devriez pouvoir faire quelque chose de similaire dans la plupart des autres implémentations de regex.

    MISE À JOUR: J’ai trouvé un moyen beaucoup plus rapide de le faire ici: http://regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e03

    Il utilise toujours le regroupement (je ne trouve pas un moyen qui n’utilise pas le regroupement). Mais cette méthode est plus de 10 fois plus rapide que la première.

    Vous pouvez utiliser un lookahead négatif, ou quelque chose comme ça:

     ^([^A]|A([^B]|B([^C]|$)|$)|$).*$ 

    Peut-être que cela pourrait être simplifié un peu.

    Essayez cette expression régulière:

     ^(.{0,2}|([^A]..|A[^B].|AB[^C])|.{4,})$ 

    Il décrit trois cas:

    1. moins de trois caractères arbitraires
    2. exactement trois caractères, soit
      • le premier n’est pas A ou
      • le premier est A mais le second n’est pas B , ou
      • le premier est A , le second B mais le troisième n’est pas C
    3. plus de trois caractères arbitraires