2010-09-30 3 views
23

Est-il possible d'écrire une expression régulière qui correspond à toutes les chaînes qui ne contient pas seulement contenir des nombres? Si nous avons ces chaînes:Regex: Comment faire correspondre une chaîne qui n'est pas seulement des chiffres

  • abc
  • a4c
  • 4bc
  • AB4

Il doit correspondre à t il quatre d'abord, mais pas le dernier. J'ai essayé de bidouiller RegexBuddy avec des lookaheads et des trucs, mais je n'arrive pas à le comprendre.

Répondre

31
(?!^\d+$)^.+$ 

Ceci dit lookahead pour les lignes qui ne contiennent pas tous les chiffres et correspondent à la ligne entière.

+0

C'est essentiellement ce que j'ai fini avec :) – Svish

+1

Donc ... en gros, vous avez trouvé une expression compliquée pour/\ D /. –

+1

Eh bien non, \ D est différent du mien car il ne correspond qu'aux non-chiffres. Mine renvoie les correspondances qui incluent la chaîne entière lorsqu'une correspondance est faite alors que juste \ D pourrait être plusieurs correspondances par ligne. Mon regex renvoie 4 correspondances tandis que \ D renvoie 17 (pour chaque non-chiffre). –

5
/^\d*[a-z][a-z\d]*$/ 

Peut être un chiffre au début, puis au moins une lettre, puis des lettres ou des chiffres

+2

C'est de loin le plus facile lire et comprendre. – enyo

9

À moins que je manque quelque chose, je pense que le regex la plus concise est ...

/\D/ 

... en d'autres termes, y a-t-il un non-chiffre dans la chaîne?

+0

cela échouera s'il y a un chiffre dans la chaîne autant que je peux voir – Svish

+0

@Svish: votre déclaration n'a aucun sens. – SilentGhost

+0

@Svish, peut-être que vous devriez l'essayer avant de dire quelque chose. C'est beaucoup plus concis que la réponse que vous avez choisie, et cela fonctionne. Il n'échouera pas s'il y a des chiffres dans la chaîne, il échouera seulement s'il ne peut pas trouver un "non-chiffre", qui est exactement ce que vous avez demandé. –

2

Puisque vous avez dit "match de", ne valide pas juste, l'expression régulière suivante correspondra correctement

\b.*[a-zA-Z]+.*\b 

Tests Passing:

abc 
a4c 
4bc 
ab4 
1b1 
11b 
b11 

tests ayant échoué:

123 
+0

Est-ce que '\ b. * \ D +. * \ B' pourrait aussi fonctionner? –

+1

@Jin, dépend, '[a-zA-Z]' n'est pas la même chose que '\ D'. '\ D' est" pas un chiffre ". Donc, s'ils ne veulent pas de 0 à 9 et que la ponctuation leur convient, alors oui, '\ D' serait plus précis. – CaffGeek

6

jjnguy avait correct (si légèrement redondant) dans un earlier revision.

.*?[^0-9].* 

@Chad, votre regex,

\b.*[a-zA-Z]+.*\b 

devrait probablement permettre des lettres non (par exemple, ponctuation), même si les exemples de Svish ne comprenaient pas un. L'exigence principale de Svish était: tous ne sont pas des chiffres.

\b.*[^0-9]+.*\b 

Ensuite, vous n'avez pas besoin + là-dedans depuis tout ce que vous avez besoin est de garantir 1 non chiffres est là (plus peut-être là-dedans comme couvert par la. * Sur les extrémités).

\b.*[^0-9].*\b 

Ensuite, vous pouvez supprimer le \ b à chaque extrémité puisque ceux-ci sont contraintes inutiles (invoquant référence à Alphanum et _).

.*[^0-9].* 

Enfin, notez que cette dernière regex montre que le problème peut être résolu avec juste les bases, les bases qui existent depuis des décennies (par exemple, pas besoin de la fonction look-ahead). En anglais, la question était logiquement équivalente à simplement demander qu'un caractère de contre-exemple soit trouvé dans une chaîne.

Nous pouvons tester cette expression régulière dans un navigateur en copiant ce qui suit dans la barre d'adresse, en remplaçant la chaîne "6576576i7567" par ce que vous voulez tester.

javascript:alert(new String("6576576i7567").match(".*[^0-9].*")); 
0

Si nous voulons limiter les caractères valides pour que la chaîne peut être faite à partir d'un nombre limité de caractères, essayez ceci:

(?!^\d+$)^[a-zA-Z0-9_-]{3,}$ 

ou

(?!^\d+$)^[\w-]{3,}$ 

/\ w + /: Correspond à une lettre, un nombre ou un trait de soulignement. tout caractère mot

2

Essayez ceci:

/^.*\D+.*$/ 

Il retourne vrai s'il y a un symbôle, ce n'est pas un numéro. Fonctionne bien avec toutes les langues.

2

si vous essayez de faire correspondre les mondes qui ont au moins une lettre, mais ils sont formés par des chiffres et des lettres (ou seulement des lettres), ce que je l'ai utilisé:

(\d*[a-zA-Z]+\d*)+ 
Questions connexes