2010-07-26 5 views
5

Est-ce que quelqu'un sait où je peux trouver une expression régulière correspondant à une expression régulière de style C# valide? Est-ce même possible?Expression régulière correspondant à une expression régulière valide

FYI, la raison pour laquelle j'essaye de faire ceci est parce que j'ai un mini langage qui permet des expressions régulières dans sa syntaxe et j'ai brouillé ensemble regex crummy pour valider les instructions mini-langue mais il échoue incorrectement des expressions plus compliquées. La syntaxe du mini-langage est définie par une combinaison de eBNF et d'expressions régulières. Je pourrais faire cette 'validation' en C# mais je pense que si cette approche est possible, ce serait la plus nette et la meilleure séparation des préoccupations.

Merci, brian

+0

La regex doit-elle être écrite dans le format .NET? – kennytm

Répondre

10

Non, vous ne pouvez pas. Au moins pas généralement. Les expressions régulières décrivent des langages réguliers et ceux-ci sont caractérisés par le fait qu'ils ne peuvent pas contenir d'expressions imbriquées arbitrairement. Donc quelque chose comme

(ab(?:cd)e(fg)) 

est déjà à peu près impossible à valider avec des expressions régulières seulement. Alors que certaines saveurs d'expressions régulières permettent une descente récursive dans le match (Perl, par exemple) ou des groupes de capture équilibrés qui peuvent l'imiter dans une certaine mesure, il est certainement l'outil pour ce travail et vous ne devriez pas essayer en un.

Ce que vous pouvez est juste essayer de compiler une expression que vous souhaitez valider. Le moteur d'expressions régulières de .NET lèvera une exception si le modèle n'est pas valide:

var compiledRegex = new Regex(someString); 
+0

C'est ce dont j'avais peur, mais si c'est la seule option, je suppose que je dois y faire face. Merci pour la clarification/explication. –

+0

L'utilisation d'exceptions pour contrôler le flux de l'application n'est pas la meilleure pratique, mais écrire un validateur pour les expressions régulières n'est pas trivial. –

+0

Eh bien en utilisant la ligne "new Regex (someString);" va essentiellement valider l'expression rationnelle. La chaîne en cours de validation est techniquement entrée par l'utilisateur, donc piéger une exception sur une mauvaise entrée de l'utilisateur est probablement la façon la plus raisonnable de gérer cela. Droite? –

Questions connexes