2012-05-11 14 views
5

Esempio di testo (che ho messo in evidenza i desiderati / 's):Get slash se non entro parentesi quadre

coppia [@ Key = 2] Articoli // Articolo [Persona/Name =' Martin'] / Data

Sto provando a ottenere ogni barra in avanti che non sia all'interno di una parentesi quadra, chiunque sia in grado di aiutarmi con Regex in questo? L'uso sarebbe:

string[] result = Regex.Split(text, pattern); 

ho fatto con questo codice, ma chiedevo se ci fosse un Regex più semplice che avrebbe fatto la stessa cosa:

private string[] Split() 
{ 
    List<string> list = new List<string>(); 
    int pos = 0, i = 0; 
    bool within = false; 
    Func<string> add =() => Format.Substring(pos, i - pos); 
    //string a; 
    for (; i < Format.Length; i++) 
    { 
     //a = add(); 
     char c = Format[i]; 
     switch (c) 
     { 
      case '/': 
       if (!within) 
       { 
        list.Add(add()); 
        pos = i + 1; 
       } 
       break; 
      case '[': 
       within = true; 
       break; 
      case ']': 
       within = false; 
       break; 
     } 
    } 
    list.Add(add()); 
    return list.Where(s => !string.IsNullOrEmpty(s)).ToArray(); 
} 

risposta

2

utilizzando Regex.Matches potrebbe essere un approccio migliore rispetto al tentativo di utilizzare split. Invece di specificare un modello da dividere, si prova ad abbinare i risultati desiderati. Questo funziona in casi di base:

string[] FancySplit(string input) { 
    return Regex.Matches(input, @"([^/\[\]]|\[[^]]*\])+") 
     .Cast<Match>() 
     .Select(m => m.Value) 
     .ToArray(); 
} 

L'approccio della espressione regolare è quello di cercare una sequenza di:

  • caratteri che non sono [, ], o /
    o
  • A sequenza del modulo [ qualcosa ], dove qualcosa è consentito contenere /
2

Questo non funziona per il generale caso, ma lo farà casi più pratici destra:

(?<!\[[^]]+)/ 

Questa espressione utilizza un negative lookbehind per abbinare una barra se non è preceduto da una parentesi quadra seguito da una sequenza di charact diverso da una parentesi quadra chiusa.

+1

Per chiarire che cosa significa "casi pratici" per questa risposta, questa espressione regolare funzionerà finché non è possibile "annidare" le parentesi quadre. Se puoi fare qualcosa del genere: 'asdf [123 [456] \] jkl' allora questa risposta non funzionerà. – Servy

+0

@Servy Hai perfettamente ragione: se vuoi consentire parentesi annidate, le soluzioni basate su regexp non sarebbero teoricamente possibili, per la stessa ragione per cui non è possibile scrivere una stringa regex con stringhe bilanciate con parentesi sbilanciate. – dasblinkenlight

+0

Questo funziona grazie - ma posso andare con la soluzione di @recursive –

Problemi correlati