web-dev-qa-db-fra.com

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

Une expression régulière peut-elle être utilisée pour faire correspondre n'importe quelle chaîne sauf une constante de chaîne spécifique, disons "ABC"? Est-ce possible d'exclure une seule constante de chaîne? Merci votre aide à l'avance.

109
V Govind

Vous devez utiliser une assertion de prévision négative.

(?!^ABC$)

Vous pouvez par exemple utiliser ce qui suit.

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

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

^((?!ABC).)*$
132
Daniel Brückner

Dans .NET, vous pouvez utiliser le groupement à votre avantage comme ceci:

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

Vous remarquerez que:

(ABC)|(.)

Va tout saisir sauf ABC dans le 2ème groupe. Des parenthèses entourent chaque groupe. Donc (ABC) est le groupe 1 et (.) Est le groupe 2.

Donc, vous prenez juste le 2ème groupe comme celui-ci dans un remplacement:

$2

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

Vous devriez également 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 faire cela ici: http://regexhero.net/tester/?id=997ce4a2-878c-41f2-9d28-34e0c5080e

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

5
Steve Wortham

Ce n’est pas facile, à moins que votre moteur d’expression régulière dispose d’un support spécifique. Le moyen le plus simple consiste à 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";

Celle-ci dit en gros "si elle commence par non -f, le reste peut être n'importe quoi; si elle commence par f, non -o, le reste peut être n'importe quoi; sinon, si cela commence fo, le caractère suivant aurait intérêt à ne pas être un autre o ".

4
derobert

Vous pouvez utiliser un préfixe négatif, ou quelque chose comme ceci:

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

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

4
Adam Crume

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, tandis que
    • 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 personnages arbitraires
2
Gumbo