2017-10-20 37 views
1

J'essaie de créer un modèle qui me permet de diviser une chaîne sur les virgules mais en ignorant les expressions entre accolades.Séparations de chaînes d'expressions régulières

mon code existant fonctionne très bien si un seul groupe d'expressions accolades existe dans la chaîne.

Dim expression As New Regex(",(?=(?:[^\{]*\{[^\{]*\})*(?![^\}]*\}))") 

     Try 
      parts = expression.Split(sortString) 
      For Each Item In parts 
       If Not Item Is Nothing Then 
        result.Add(Item) 
       End If 
      Next 

      Return result 

Si je passe la chaîne

{IIF(Hemo.Site = "LV",1,IIF(Hemo.Site = "SVC",2,IIF(Hemo_Pressures.Site = "AO",3,4)))},Site DESC,Pressure1 ASC 

Il fonctionne, le groupement Accolade est ignorée et chaque chaîne après est rompu avec la scission de coma.

Le problème est. Si j'ai besoin d'accueillir plusieurs groupes d'expressions de crochet dans ma chaîne et qu'il commence à échouer.

Cela échoue:

{IIF(Hemo.Site = "LV",1,IIF(Hemo.Site = "SVC",2,IIF(Hemo_Pressures.Site = "AO",3,4)))},Site DESC,{IIF(Hemo.Site = "LV",1,IIF(Hemo.Site = "SVC",2,IIF(Hemo.Site = "AO",3,4)))}, Pressure1 ASC 

un du groupement est ignoré comme il devrait être, mais l'autre groupe de accolades n'est pas. Résultant d'une collection sale.

J'apprécierais une deuxième paire d'yeux sur ceci.

+0

Essayez ceci ', (?! [^ {] * \})'. Je n'ai pas fait de tests exhaustifs, mais cela semble fonctionner pour moi. –

+0

Fonctionne parfaitement ... beaucoup plus élégante que mon modèle merci. –

+0

J'ai trouvé quelques problèmes s'il y a un texte contenant '}' entre les virgules qu'il devrait séparer, par exemple '1,2, {1,2,3}, 4,5,} 6' ne se divise pas correctement. J'espère que ce ne sera pas un problème pour vous. –

Répondre

0

Le modèle ,(?![^{]*\}) semble fonctionner pour moi, tant qu'il n'y a pas perdre { ou } flottant dans le texte.

en panne, il évalue comme

, 
zero-width negative lookahead 
    Any character not in "{" 
    * (zero or more times) 
    } 
End Capture 

Vous pouvez utiliser *,(?![^{]*\}) * pour couper les espaces immédiatement avant et après des virgules si nécessaire.


Sur votre chaîne de test, il produit le grand écart de suivi:

  • {IIF (Hemo.Site = "LV", 1, IIF (Hemo.Site = "SVC", 2, IIF (Hemo_Pressures.Site = "AO", 3,4)))}
  • site
  • DESC {IIF (Hemo.Site = "LV", 1, IIF (Hemo.Site = "SVC", 2, IIF (Hemo.Site = "AO", 3,4))}
  • Pression1 ASC

Cependant, il ne parviendra pas à correctement les chaînes comme diviser

Apple, Ban} ana, carotte {1,2,3}, grenouille, chat, 1,2,3

en raison de la perte } dans "banane"

+0

Merci, je me cognais la tête contre un mur! –