Regex: comment faire correspondre une chaîne qui n'est pas seulement des nombres

Est-il possible d'écrire une expression régulière qui correspond à toutes les chaînes qui ne seulement contiennent des nombres? Si nous avons ces chaînes:

  • abc
  • a4c
  • 4bc
  • ab4
  • 123

Il devrait correspondre aux quatre premiers, mais pas au dernier. J'ai essayé de jouer dans RegexBuddy avec des lookaheads et d'autres choses, mais je n'arrive pas à le comprendre.

25
demandé sur Svish 2010-09-30 17:39:05

11 réponses

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

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

34
répondu Mike Cheel 2017-09-04 09:26:56

Sauf si je manque quelque chose, je pense que la regex la plus concise est...

/\D/

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

10
répondu Daniel Standage 2010-09-30 18:54:36
/^\d*[a-z][a-z\d]*$/

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

5
répondu luchaninov 2010-09-30 13:42:11

Jjnguy l'avait correcte (si elle était légèrement redondante) dans une révision antérieure .

.*?[^0-9].*

@Tchad, votre regex,

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

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

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

Ensuite, vous n'avez pas besoin du + car tout ce dont vous avez besoin est de garantir que 1 non-digit est là (plus pourrait être là comme couvert par le .* sur la fourchues).

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

Ensuite, vous pouvez supprimer le \ b à chaque extrémité car ce sont des contraintes inutiles(en invoquant une 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, ces bases qui existent depuis des décennies (par exemple, pas besoin de la fonctionnalité look-ahead). En anglais, la question était logiquement équivalente à demander simplement que 1 caractère de contre-exemple soit trouvé dans une chaîne.

On peut testez cette expression rationnelle dans un navigateur en copiant ce qui suit dans la barre d'emplacement, en remplaçant la chaîne "6576576i7567" par ce que vous voulez tester.

javascript:alert(new String("6576576i7567").match(".*[^0-9].*"));
5
répondu Jose_X 2017-05-23 11:54:10

Essayez ceci:

/^.*\D+.*$/

Il renvoie true s'il y a un simbol, ce n'est pas un nombre. Fonctionne très bien avec toutes les langues.

3
répondu Zhenya Hristova 2016-01-21 15:29:23

Puisque vous avez dit " match ", pas seulement valider, la regex suivante correspondra correctement

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

Tests Réussis:

abc
a4c
4bc
ab4
1b1
11b
b11

Essais Échoués:

123
2
répondu CaffGeek 2010-09-30 14:21:02

Si vous essayez de faire correspondre des mondes qui ont au moins une lettre mais qui sont formés par des chiffres et des lettres (ou simplement des lettres), voici ce que j'ai utilisé:

(\d*[a-zA-Z]+\d*)+
2
répondu jjaappoo 2016-12-15 00:25:10

Si nous voulons restreindre les caractères valides afin que la chaîne puisse être faite à partir d'un ensemble limité de caractères, essayez ceci:

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

Ou

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

/\w+/: Correspond à n'importe quelle lettre, numéro ou trait de soulignement. tout caractère de mot

0
répondu Vinay Vemula 2014-12-01 11:27:51
.*[^0-9]{1,}.*

Fonctionne très bien pour nous.

Nous voulons utiliser la réponse utilisée, mais cela ne fonctionne pas dans le modèle YANG.

Et celui que j'ai fourni ici est facile à comprendre et c'est clair: le début et la fin peuvent être des caractères, mais, mais il doit y avoir au moins un caractère non numérique, ce qui est le plus grand.

0
répondu miniduan 2018-04-25 01:29:52

J'utilise /^[0-9]*$/gm dans mon code JavaScript pour voir si string n'est que des nombres. Si oui, alors il devrait échouer sinon il retournera la chaîne.

Ci-Dessous fonctionne extrait de code avec des cas de test:

function isValidURL(string) {
  var res = string.match(/^[0-9]*$/gm);
  if (res == null)
    return string;
  else
    return "fail";
};

var testCase1 = "abc";
console.log(isValidURL(testCase1)); // abc

var testCase2 = "a4c";
console.log(isValidURL(testCase2)); // a4c

var testCase3 = "4bc";
console.log(isValidURL(testCase3)); // 4bc

var testCase4 = "ab4";
console.log(isValidURL(testCase4)); // ab4

var testCase5 = "123"; // fail here
console.log(isValidURL(testCase5));
0
répondu VicJordan 2018-04-25 02:05:20

J'ai dû faire quelque chose de similaire dans MySQL et ce qui suit tout en simplifiant semble avoir fonctionné pour moi:

Où fieldname regexp ^[a-zA-Z0-9]+$ et fieldname pas REGEXP ^[0-9]+$

Cela montre tous les champs qui sont alphabétiques et alphanumériques, mais tous les champs qui sont juste numériques sont masqués. Cela semble fonctionner.

Exemple:

Nom1-Affiché
nom-affiché
nom2-affiché
nom3-affiché
nom4-affiché
n4ame - Afficher
324234234 - Non Affiché

0
répondu ChrisAardvark 2018-09-27 10:00:50