Quelle expression régulière correspondra à chaque caractère, sauf la virgule ',' ou le point-virgule ';'?

345

Est-il possible de définir une expression régulière qui correspondra à chaque caractère, à l'exception d'un certain caractère défini ou d'un ensemble de caractères?

Fondamentalement, je voulais diviser une chaîne par une virgule (,) ou un point-virgule (;). Je pensais donc à le faire avec une expression régulière qui correspondrait à tout jusqu'à ce qu'elle rencontre une virgule ou un point-virgule.

Kshitij Saxena -KJ-
la source

Réponses:

474
[^,;]+         

Vous n'avez pas spécifié l'implémentation d'expression régulière que vous utilisez. La plupart d'entre eux ont une Splitméthode qui prend les délimiteurs et les sépare. Vous voudrez peut-être utiliser celui-ci avec une ^classe de caractères "normale" (sans ):

[,;]+
Mehrdad Afshari
la source
10
Et la question ne précise pas si les séparateurs adjacents sont autorisés, donc le «+» de fin est légèrement douteux.
Jonathan Leffler
Obtenir une erreur uniquement pour le point-virgule - l'expression
régulière non terminée
J'avais une exigence similaire où je veux éviter les points-virgules et les virgules à la fin, j'ai beaucoup essayé mais aucun succès ci-dessous n'est le 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; Eh bien ça valide si j'utilise, et; entre les deux mais échoue à la fin à vliadate.
Harry
87

Utilisez des classes de caractères. Une classe de caractères commençant par un signe d'insertion correspondra à tout ce qui n'est pas dans la classe.

[^,;]
Thom Smith
la source
2
En savoir plus sur les classes de personnages
HEX
J'avais une exigence similaire où je veux éviter les points-virgules et les virgules à la fin, j'ai beaucoup essayé mais aucun succès ci-dessous n'est le 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; Eh bien ça valide si j'utilise, et; entre les deux mais échoue à la fin à vliadate.
Harry
2

Utilisez ceci:

([^,;]*[,;])*
NawaMan
la source
5
Cela nécessite 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); généralement, vous ne voulez pas insister sur une virgule ou un point-virgule après le dernier champ. Si votre moteur d'expression régulière est suffisamment puissant, vous pouvez utiliser ' (?:([^,;]*)(?:[^,;]|$))' (PCRE avec des parenthèses non capturantes). Les alternatives d'une virgule ou d'un point-virgule après le champ ou la fin de l'enregistrement améliorent le fonctionnement. Vérifiez également si les champs vides sont autorisés.
Jonathan Leffler
1
Enfin, vous devez vous soucier de ce qui est réellement retourné 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 retournés par la notation de capture.
Jonathan Leffler
1
Vous avez raison sur tout cela, mais la raison pour laquelle je n'ai pas concordé ces choses dans ma réponse est que je ne sais pas quelle langue / bibliothèque de RegEx l'interrogateur demande. Il utilise peut-être "GREP". Quoi qu'il en soit, je vous remercie d'avoir ajouté ces commentaires pour clarifier les choses pour lui. : D
NawaMan