429 votes

Quelle expression rationnelle correspondra à tous les caractères sauf la virgule ',' ou le point-virgule ';' ?

Est-il possible de définir une expression rationnelle qui correspondra à tous les caractères, à l'exception d'un caractère ou d'un ensemble de caractères définis ?

En gros, je voulais séparer une chaîne de caractères par une virgule (,) ou un point-virgule ( ;). Je pensais donc le faire avec une regex qui correspondrait à tout jusqu'à ce qu'elle rencontre une virgule ou un point-virgule.

575voto

Mehrdad Afshari Points 204872
[^,;]+         

Vous n'avez pas précisé l'implémentation de l'expression rationnelle que vous utilisez. La plupart d'entre elles ont un Split qui prend les délimiteurs et les divise par eux. Vous pourriez vouloir utiliser cette méthode avec une méthode "normale" (sans le paramètre ^ ) de la classe de caractères :

[,;]+

11 votes

De plus, la question ne précise pas si les séparateurs adjacents sont autorisés, de sorte que le "+" de queue est légèrement douteux.

0 votes

Obtention d'une erreur uniquement pour le point-virgule - une expression rationnelle non terminée rencontre la fin du fichier.

0 votes

J'ai eu une exigence similaire où je veux éviter le point-virgule et la virgule à la fin J'ai essayé beaucoup mais sans succès ci-dessous est la Regex que j'utilise const regexDomain = /^(? :[A-Za-z0-9](? :[A-Za-z0-9-]{0,61}[A-Za-z0-9]) ? \. )+[A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9]/g ; Il est validé si j'utilise , et ; entre les deux, mais ne parvient pas à vliadate à la fin.

101voto

Thom Smith Points 8204

Utilisez les classes de caractères. Une classe de caractères commençant par caret correspondra à tout ce qui n'est pas dans la classe.

[^,;]

3 votes

0 votes

J'ai eu une exigence similaire où je veux éviter le point-virgule et la virgule à la fin J'ai essayé beaucoup mais sans succès ci-dessous est la Regex que j'utilise const regexDomain = /^(? :[A-Za-z0-9](? :[A-Za-z0-9-]{0,61}[A-Za-z0-9]) ? \. )+[A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9]/g ; Il est validé si j'utilise , et ; entre les deux, mais ne parvient pas à vliadate à la fin.

51voto

knittl Points 64110

Utiliser un classe de caractère négatif :

[^,;]+

2voto

NawaMan Points 615

Utilisez ça :

([^,;]*[,;])*

5 votes

Il faut donc utiliser la virgule ou le point-virgule comme délimiteur de champ, plutôt que comme séparateur de champ. La différence est importante à la fin d'une "ligne" (ou d'une autre structure d'enregistrement numérisée) ; en général, vous ne voulez pas insister sur une virgule ou un point-virgule après le dernier champ. Si votre moteur regex est suffisamment puissant, vous pouvez utiliser ' (?:([^,;]*)(?:[^,;]|$)) ' (PCRE avec parenthèses de non capture). L'alternative d'une virgule ou d'un point-virgule après le champ, ou la fin de l'enregistrement, améliore le fonctionnement. Il faut également se demander si les champs vides sont autorisés.

1 votes

Enfin, vous devez vous préoccuper de ce qui est réellement renvoyé par les captures - vouliez-vous vraiment que les séparateurs soient inclus, et s'il y a 10 champs sur une ligne, combien d'entre eux sont renvoyés par la notation de capture.

1 votes

Vous avez raison sur tout cela mais la raison pour laquelle je n'ai pas concerté ces choses dans ma réponse est que je ne sais pas quel langage/library de RegEx le questionneur demande. Il utilise peut-être "GREP". Quoi qu'il en soit, j'apprécie que vous ayez ajouté ces commentaires pour clarifier les choses pour lui :D

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X