6
votes

Regex pour une corde jusqu'à 20 caractères longs avec une virgule

J'ai besoin de définir une regex pour une chaîne avec les exigences suivantes:

  • 20 caractères maximum
  • doit être sous la forme Nom, Nom de famille
  • Aucun chiffre et caractères spéciaux autorisés (à nouveau, c'est un nom et un nom de famille)

    J'ai déjà essayé quelque chose comme ^ [^ 1-9 \? \ * \ \ \? \ \ \ \ \ \ _ \ \ _] {1,20} [] [^ 1-9 \? . \? \ $ \ ^ \ \ \ \ -] {1,20} $ Mais comme vous pouvez le trouver, il correspond également à une chaîne longue de 40 caractères.

    Comment puis-je vérifier la longueur maximale de la chaîne entière et, en même temps, imposer 1 virgule à l'intérieur de celui-ci et évidemment pas aux frontières?

    merci


7 commentaires

Il h. Je n'ai pas le temps de le prouver maintenant (la marge n'est pas assez grande de toute façon) mais je pense que cela peut ne pas être possible avec une expression régulière.


Je suggérerais vraiment de saisir la version gratuite d'Expresso. (ou payer pour Regexbuddy). Ils sont indispensables.


En supposant que 20 est juste un nombre arbitraire, je connais des personnes avec 14 lettres dans leur nom de famille seul! Vous voudrez peut-être l'heurter si cela est pour un projet non trivial, ou vos clients pourraient être contrariés lorsqu'ils découvrent que leur nom est incompatible avec le logiciel!


@GlowCoder: L'exigence ne vient pas de mon cerveau. Je vais sûrement laisser des mots à qui est responsable ...


S'il vous plaît dites-nous, quel type de délimiteur entre les noms.


Donc, le nom et le nom de famille se composent d'au moins 1 caractères? Ou peut-il être vide ou juste l'un d'entre eux?


Quel est le délimiteur entre les noms lorsque certains noms contiennent des espaces?


6 Réponses :


-2
votes
[[a-zA-Z],[a-zA-Z]]{1,20}

5 commentaires

Non, que l'on peut comporter jusqu'à 40 caractères de long - 20 caractères ', 20 caractères


TORT!!!! J'ai explicitement dit que je ne dois pas correspondre que si toute la chaîne est de 20 caractères. Cela correspond à 41 caractères !! La prochaine fois, veuillez bien lire la question


Et aussi, certains noms / noms de famille ont des espaces, "-" ... Peut-être que vous pourrez peut-être obtenir un badge de pression de pair;)


Quel est le délimiteur entre les noms lorsque certains noms contiennent des espaces?


hey vous avez -3 votes si vous supprimez cette réponse, vous obtenez un badge



0
votes

Comme je le dis, je pense que la façon dont vous l'avez, ce n'est pas assorti par une expression régulière - c'est une langue de poussée.

Cependant, vous pouvez toujours séparer sur "" et faire correspondre chaque sous-chaîne, puis totale.


5 commentaires

J'ai considéré que l'ensemble de la vérification du modèle n'est pas uniquement associe par regex uniquement. Je pourrais sûrement utiliser la logique de validation Java / JavaScript. Mais j'ai demandé ici d'être sûr qu'il n'y a aucun moyen.


Depuis que vous pouviez même écrire toutes les cordes possibles et mettre des tuyaux entre les deux, vous pouvez clairement créer une regex ...


Bien sûr, cela peut être fait avec des expressions régulières, du moins quelles langues modernes considèrent une expression "régulière". La partie délicate est plutôt la définition de quels caractères sont valables dans un nom.


Bien sûr! En réalité, Facebook n'a pas permis aux noms d'espaces jusqu'à il y a un an ou quelque chose (et des espaces dans les noms de famille sont en réalité assez courants aux Pays-Bas)


Oui, j'aurais dû voir que les chaînes finies sont nécessairement un reconnaissance finie. Donc [a-za-z. '], [A-za-z] {1-19} + [a-za-z] {2}, [a-za-z.'] {1-18}. .. travaillera éventuellement.



0
votes

Avez-vous essayé votre exemple mais enlevez le: xxx pré>

au milieu, laissant p>

[Modifier les exemples supprimés Vous avez déjà essayé et ils n'ont pas fonctionné:] P>

Essayez ceci? P>

^[[^1-9\?\*\.\?\$\^\_],[^1-9\?\*\.\?\$\^\_\-]]{1,20}$


3 commentaires

les deux permettent plus d'un? Supprimer le [] autour de la virgule? ^ [^ 1-9 \? * \. \? \ \ \ \ \ \ _], [^ 1-9 \? * \. \? \ \ $ \ \ _ \ -]] {1,20} $


Désolé pour le Downvote Scott, mais vous êtes sur une piste totalement erronée. [] -Brackets désignant une classe de caractères, ils ne sont pas de substitution pour () -Brackets. Et si vous utilisez des crochets ronds dans votre exemple, vous obtenez des choses totalement différentes comme "Un Char suivi d'une virgule suivie d'un caractère et de toute une chose une à vingt fois"


Merci c'est très utile! Je regardais un didacticiel tout en essayant de trouver la réponse et je pense que le tutoriel est un peu déroutant et manquait certaines informations, je me souviens de faire de la réégalité au collège et de penser que je pourrais peut-être trouver une réponse, oh bien



5
votes

Vous pouvez le faire en utilisant des assertions négatives en avant: xxx

La regex contient deux parties maintenant, la définition effective et une déclaration au début, en disant que de ce point, il n'y en a pas Soyez 21 caractères.

EDIT:

Donc, pour la définition indiquée ci-dessus, la regex devient xxx


5 commentaires

Semble étroit. J'ai essayé de tester ", nom de famille" et ça correspond. Pas le résultat attendu, mais peut-être que si je remplace * avec + je peux obtenir quelque chose de bien


À propos, je vous accepte actuellement, vous n'incluez actuellement que des lettres (les noms ont des espaces ou des citations simples telles que "D'Amato", des accents, etc.) Et je compte vraiment que votre réponse est acceptée après avoir effectué quelques tests


Oui, je viens de prendre un simple ensemble de caractères à tester avec. Il suffit de remplacer votre décodeur, et cela devrait fonctionner. Et en effet, vous voulez + au lieu de *, je vais éditer cela.


Ça devrait vraiment être "^ (?!. {21}) [^ 1-9 \? * \. \? \ \ \ \ \ \ \ \ \,] +, [^ 1-9 \? * \ \ ^ _ \,] + $ ", mais si l'assertion fonctionne, il bat ma réponse par un mile :-)


Éditôt, juste pour être clair. Cela fonctionne au moins dans les langues qui soutiennent les affirmations avant. Dans d'autres langues, votre solution est la bonne.



4
votes

La réponse évidente serait: Ne demandez pas le nom et le nom de famille dans le même champ de saisie.

Si vous voulez toujours le faire: Il n'y a pas de moyen facile de savoir que je sache, mais voici une possibilité. Pour voir le principe, pensez à votre [^ 1-9 \? \ \ \ \ \? \ \ \ \ \ \ \ \,] au lieu de x (j'ai ajouté il < code> \, car il est un peu important: -)). xxx

assez moche, mais devrait fonctionner.

sur un autre Remarque: vous ne capturez pas presque tous les caractères spéciaux avec votre gamme exclusive. Mais c'est probablement encore mieux qu'une gamme inclusive.


1 commentaires

Désolé, mais la réponse évidente n'est pas une option pour moi, ce n'est pas un designer;) Quoi qu'il en soit, évolu depuis la laide solution au moins fonctionne



6
votes

Essayez la regex: xxx pré>

link rubulaire Strong> p>

Explication: P>

^                : Start anchor
(?=[^,]+,[^,]+$) : Positive lookahead to ensure string has exactly one comma
                   surrounded by atleast one non-comma character on both sides.
[a-zA-Z,]{1,20}  : Ensure entire string is of length max 20 and has only 
                   letters and comma
$                : End anchor


1 commentaires

Très bonne explication. Je l'ai essayé dans Regexlib.com/reter.aspx mais il ne correspond pas "Nom, Nom" . Quel est le problème avec ma copie / pâte?