Ce que vous avez, il est un exemple de Friedl est "déroulé de la boucle" technique", mais vous semblez avoir une certaine confusion sur la façon de l'exprimer comme une chaîne littérale. Voici à quoi il devrait ressembler à la regex compilateur:
"[^"\\]*(?:\\.[^"\\]*)*"
La première "[^"\\]*
correspond à un guillemet suivi par zéro ou plus de tous les caractères autres que des guillemets ou des barres obliques inverses. La partie à lui seul, le long avec le dernier "
, correspondra à une simple chaîne de caractères entre guillemets avec pas intégré les séquences d'échappement, comme "this"
ou ""
.
Si elle ne rencontre une barre oblique inverse, \\.
consomme de la barre oblique inverse et tout ce qui suit, et [^"\\]*
(encore une fois) consomme tout jusqu'à la prochaine barre oblique ou un guillemet simple. La partie répété autant de fois que nécessaire jusqu'à ce qu'un sans échappement guillemet tourne vers le haut (ou il atteint la fin de la chaîne et le match tentative échoue).
Notez que ce match "foo\"-
en \"foo\"-"bar"
. Cela peut sembler pour exposer une faille dans la regex, mais il n'en est rien; c'est l' entrée qui est invalide. L'objectif était de faire correspondre une chaîne entre guillemets, éventuellement contenant des anti-slash-échappé citations, incorporé dans un autre texte--pourquoi y aurait-il échappé citations à l'extérieur de la cité de cordes? Si vous avez vraiment besoin de soutien que vous avez beaucoup plus d'un problème complexe, nécessitant une approche très différente.
Comme je l'ai dit, le ci-dessus est de savoir comment les regex devrait se tourner vers les regex compilateur. Mais vous l'écrivez dans la forme d'une chaîne littérale, et ceux qui ont tendance à traiter certains caractères spécialement--c'est à dire, les barres obliques inverses et les guillemets. Heureusement, C#verbatim les chaînes de vous épargner les tracas d'avoir à double-barres obliques inverses; vous avez juste à échapper à chaque guillemet avec un autre guillemet:
Regex r = new Regex(@"""[^""\\]*(?:\\.[^""\\]*)*""");
La règle est donc double guillemets pour le compilateur C# et double anti-slash pour les regex compilateur--agréable et facile. Cette regex peut sembler un peu maladroit, avec les trois guillemets à chaque extrémité, mais considère l'alternative:
Regex r = new Regex("\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"");
En Java, vous toujours avoir à écrire de cette façon. :-( D'ailleurs, si vous souhaitez vous assurer qu'il n'y a pas de ligne de séparation des caractères dans les chaînes entre guillemets, vous pouvez les inclure dans les classes de caractère niées:
Regex r = new Regex(@"""[^""\r\n\\]*(?:\\.[^""\r\n\\]*)*""");
Le point en \\.
déjà exclut les séparateurs de ligne, tant que vous ne spécifiez pas l' Singleline
option.