2011-04-08 5 views
10

Je dois écrire une expression régulière pour la validation de formulaire qui autorise les espaces dans une chaîne, mais ne permet pas seulement l'espace blanc.Expression régulière qui autorise les espaces dans une chaîne, mais pas seulement les espaces vides

Par exemple - 'Chicago Heights, IL' serait valide, mais si un utilisateur venait d'appuyer sur la barre d'espace un certain nombre de fois et appuyez sur Entrée le formulaire ne validerait pas. Précédant la validation, j'ai essayé d'exécuter un if (foo != null) puis d'exécuter l'expression régulière, mais en tapant la barre d'espace, des caractères sont toujours enregistrés, ce qui ne fonctionnait pas. Voici ce que j'utilise en ce moment qui permet aux espaces:

^[-a-zA-Z0-9_:,.' ']{1,100}$ 
+0

Quelle langue? Java/C#? – kennytm

Répondre

15

Je ne suis pas sûr que vous avez besoin d'un RegEx ici. Pourquoi ne pas simplement appeler la méthode Trim() de votre langue, puis vérifier que la chaîne résultante n'est pas vide?

+0

Est-ce que cela ne réduira pas les espaces blancs ... Je dois encore tenir compte de l'espace blanc entre les mots - ex. Chicago, IL (a besoin de l'espace entre la virgule et la capitale I). – user699242

+0

Cela dépend de la langue, bien sûr, mais la plupart des méthodes Trim() éliminent seulement l'espace blanc à chaque extrémité de la chaîne. En outre, vous n'avez pas à * utiliser * la chaîne tronquée si vous ne le souhaitez pas. C'est juste que Trim() - une chaîne qui est tout espace blanc renverra la chaîne vide, ce qui est facile à vérifier. – dlev

+0

Oh, génial !! Je vais essayer. Je vous remercie. C'est juste JavaScript, d'ailleurs. – user699242

26

Il est très simple: .*\S.*

Cela nécessite un caractère non-espace, en tout lieu. La syntaxe de l'expression régulière est pour les expressions régulières compatibles Perl 5, si vous avez un autre langage, la syntaxe peut différer un peu.

+0

Je viens de le remarquer. Ont supprimé, et offrent mes excuses. – dlev

+0

Cela ne concerne pas le maximum de 100 caractères, cependant. Votre '. *' Est également plus large que sa classe de caractères. –

+0

Je n'ai pas lu le 100 comme une exigence, seulement comme ce que l'affiche originale a essayé jusqu'ici. La limite peut être exprimée comme une expression régulière, mais comme les expressions régulières ne peuvent pas compter les caractères, cela serait gênant d'écrire. Il est beaucoup plus simple d'ignorer complètement les expressions régulières dans ce cas et d'écrire 's = s.trim(); if (s.length()> = 1 && s.length() <= 100) {...} ' –

-1

Essayez cette expression régulière:

^[^\s]+(\s.*)?$ 

Cela signifie un ou plusieurs caractères qui ne sont pas d'espace, puis, éventuellement, un espace suivi par quoi que ce soit.

+0

Cette expression n'autorise pas les espaces. – dlev

+0

Cela ne permettrait que des espaces non-espaces. –

+0

Vous avez raison ... Je vais le changer –

5

Vous pouvez utiliser simple:

^(?=.*\S).+$ 

si votre moteur regex supporte lookaheads positifs. Cette expression nécessite au moins un caractère autre qu'un espace.

Voir sur rubular.

5

Ce qui suit répondre à votre question écrite, mais voir ma note supplémentaire après:

^(?!\s*$)[-a-zA-Z0-9_:,.' ']{1,100}$ 

Explication: Le (?!\s*$) est un negative lookahead. Cela signifie: "Les caractères suivants ne peuvent pas correspondre au sous-motif \s*$." Lorsque vous prenez en compte le sous-motif, cela signifie: "Les caractères suivants ne peuvent pas être une chaîne vide, ni une chaîne d'espaces jusqu'à la fin, par conséquent il doit y avoir au moins un caractère non-espace après ce point la chaîne. " Une fois que vous avez cette règle à l'écart, vous êtes libre d'autoriser des espaces dans votre classe de personnage.

Note supplémentaire: Je ne pense pas que votre ' ' fasse ce que vous voulez. Il semble que vous essayiez de représenter un caractère espace, mais regex interprète ' comme une apostrophe littérale. A l'intérieur d'une classe de caractères, ' ' signifierait "correspondre à n'importe quel caractère qui est ', un caractère espace, ou '" (notez que le deuxième caractère ' est redondant). Je soupçonne ce que vous voulez est plus comme ceci:

^(?!\s*$)[-a-zA-Z0-9_:,.\s]{1,100}$ 
+0

Cela ressemble à ce que je cherchais, mais pour une raison quelconque, les espaces blancs passent encore la regex dans mon script. Des idées pour lesquelles cela pourrait être? – user699242

+0

@ user699242 - Hmm. Il semble fonctionner correctement ici: http://rubular.com/r/V8nlkU7E5R et avec quelques lettres jetées dedans: http://rubular.com/r/8qjj4Z2PWs. Quelle langue de regex utilisez-vous? –

+1

C'est la réponse la plus correcte, je pense. La recherche négative fait exactement ce qui était requis. –

-1

Il suffit d'utiliser \s* pour éviter un ou plusieurs espaces vides dans l'expression régulière entre deux mots.

Par exemple, "Mozilla/ 4.75" et "Mozilla/4.75" les deux peuvent être abondés par l'expression régulière suivante:

[A-Z][a-z]*/\s*[0-9]\.[0-9]{1,2} 

Ajout \s* matchs à zéro, un ou plusieurs espaces vides entre deux mots.

0

Si nous voulions appliquer la validation uniquement avec caractères admis alors j'ai essayé avec USERNAME_REGEX = /^(?:\s*[.\-_]*[a-zA-Z0-9]{1,}[.\-_]*\s*)$/;

  • Une chaîne peut contenir un nombre quelconque d'espaces au début ou à la fin ou entre mais contiennent au moins un caractère alphanumérique .
  • Les caractères optionnels ., _ , - sont également autorisés mais la chaîne doit avoir un caractère alphanumérique.
Questions connexes