2009-09-11 6 views
211

Est-il possible de définir une regex qui va correspondre à tous les caractères sauf un certain caractère défini ou un ensemble de caractères? Fondamentalement, je voulais séparer une chaîne par une virgule (,) ou un point-virgule (;). Donc je pensais le faire avec une regex qui correspondrait à tout jusqu'à ce qu'il rencontre une virgule ou un point-virgule.Quelle regex correspondra à tous les caractères sauf la virgule ',' ou le point-virgule ';'?

Répondre

291
[^,;]+   

Vous n'avez pas spécifié l'implémentation d'expressions régulières que vous utilisez. La plupart d'entre eux ont une méthode Split qui prend des séparateurs et les divise. Vous pouvez utiliser celui-là avec un « normal » (sans ^) classe de caractères:

[,;]+ 
+6

Et la question ne précise pas si les séparateurs adjacents sont autorisés, de sorte que la fuite '+' est un peu douteux. –

+0

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

54

Utiliser des classes de caractères. Une classe de caractères commençant par caret correspond à tout ce qui n'est pas dans la classe.

[^,;] 
+1

En savoir plus sur les [classes de caractères nuls] (http://www.regular-expressions.info/charclass.html) – HEX

2

Utilisez ceci:

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

Cela nécessite la virgule ou le point-virgule comme un délimiteur de champ, plutôt que comme un 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 regex est assez puissant, vous pouvez utiliser ''(?: ([^ ,;] *) (?: [^ ,;] | $))'' (PCRE avec parenthèses non-capturantes). Les alternatives d'une virgule ou un point-virgule après le champ, ou la fin de l'enregistrement, rend les choses fonctionnent mieux. Vérifiez également si les champs vides sont autorisés. –

+1

Enfin, vous devez vous soucier de ce qui est réellement retourné par les captures - voulez-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

Vous avez raison à propos de tout cela, mais la raison pour laquelle je n'ai pas concerté 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". De toute façon, je vous remercie d'avoir ajouté ces commentaires pour clarifier les choses pour lui. :RÉ – NawaMan

Questions connexes