L'entrée est une chaîne représentant une liste d'éléments.Trouver la parenthèse correspondante avec Regex
Une liste est définie comme une boucle ouverte {
suivie par 0 ou plusieurs éléments séparés par des espaces suivis d'un bouclé fermé }
.
Un élément est soit un littéral, soit une liste d'éléments.
Un littéral est une succession de caractères qui ne sont pas des espaces. Si un élément contient une parenthèse bouclée, il doit être échappé avec un antislash: \{
et \}
. (Ou vous pourriez supposer Curlies ne sont pas autorisés à l'intérieur littéraux, pour simplifier)
Exemple:
"{abc { def ghi } 7 { 1 {2} {3 4} } {5 6} x\{yz \}foo }"
Pas Curly à l'intérieur littéraux:
"{abc { def ghi } 7 { 1 {2} {3 4} } {5 6} xyz foo }"
(Ceci est une définition simplifiée d'une liste Tcl Ce que je veux savoir est: l'entrée peut-elle être divisée en éléments de la boucle la plus externe en utilisant regex?
Résultats attendus:
abc
{ def ghi }
7
{ 1 {2} {3 4} }
{5 6}
x{yz
}foo
La vraie question est: peut-il être fait avec un Regex?
Je suis plus intéressé par la saveur .NET, mais acceptera toutes les réponses.
Je vais poster ma propre hypothèse dans une réponse, et voir si elle est validée ou détruite.
Pourquoi '} foo' un littéral, mais' 4} 'est pas? En fait, '}' est un littéral valide selon votre définition. – Kobi
@Kobi vous avez raison. J'essayais d'obtenir une définition similaire à celle de l'interpréteur Tcl, mais ça fait des choses étranges. Par exemple, cela permettra 'set a 3 {4' mais pas' set a {1 2 3 {4} '. Comportement similaire pour les curlies fermés. Je vais mettre à jour la question. –