2015-04-16 14 views
8

Ho un'espressione che segue alcune regole:Come sarebbe quella espressione regolare?

  • Il carattere 'deve essere primo e l'ultimo carattere
  • Non ci può essere zero o più spazi all'interno-''
  • Non ci può essere zero-or- più % all'interno ''
  • ci possono essere zero o più parole-(lettere e numeri) all'interno ''

Ex pression:

(?i)^(?<q>['])[%\p{Zs}\p{L}\p{N}|()]*\k<q>$ 

Ora ho bisogno di un'altra espressione per sostituire tutti) e (in una stringa per "TEST" per esempio, ma solo quando non sono circondati da ''. Il trucco è che quando) o (sono circondati da '' ma questi personaggi appartengono ad una coppia di differente '', non dovrebbe passare

Esempio di risultati:.

'(' > pass 
    ' (' > pass 
    ')' > pass 
    ') ' > pass 
    ' content here ' ')' > pass 
    ' content here') ' another content' > does not pass 

nota che la prima il contenuto ha il suo '', e il secondo pure. ') o

Io non sono un professionista con espressioni regolari, quindi se non sai come sarebbe qualsiasi documentazione o tutorial correlato sarebbe di grande aiuto

+0

Per quanto riguarda i tutorial, preferirei consigliare libri ... specialmente quelli di Oilly davvero lo tagliano –

risposta

3

È possibile utilizzare l'espressione regolare:

^.*[()](?=[^']*'(?>(?:[^']*'[^']*){2})*$) 

Vedere demo.

Codice:

var rgxHardNut = new Regex(@"^.*[()](?=[^']*'(?>(?:[^']*'[^']*){2})*$)"); 
var check1 = rgxHardNut.IsMatch("'('"); // true 
var check2 = rgxHardNut.IsMatch("' ('");// true 
var check3 = rgxHardNut.IsMatch("')'"); // true 
var check4 = rgxHardNut.IsMatch("') '");// true 
var check5 = rgxHardNut.IsMatch("' content here ' ')'"); // true 
var check6 = rgxHardNut.IsMatch("' content here') ' another content'"); // false 
+0

Penso che questo sia tutto ora. Florian, 'Il carattere 'deve essere il primo e l'ultimo carattere' è una condizione che l'OP per la regex ha già. Ora, questa è una regex diversa che non deve convalidare questo criterio. –

+0

Mi ci è voluta 1 ora per capire la regex ma per 2 minuti basta codificare un algoritmo ... –

+0

@ Th3B0Y: Per favore fatemi sapere se avete bisogno di ulteriore assistenza per questo problema. In caso contrario, considera di accettare la risposta che ha funzionato per te. –

3

Credo che questo dovrebbe farlo:

Regex regex = new Regex(@"^'[^']*?'(?:(?:[^()]*)'[^']*?')*$"); 

Modifica Demo

class Program 
{ 
    static void Main(string[] args) 
    { 
     Regex regex = new Regex(@"^'[^']*?'(?:(?:[^()]*)'[^']*?')*$"); 

     string shouldPass1 = "'('"; 
     string shouldPass2 = "' ('"; 
     string shouldPass3 = "')'"; 
     string shouldPass4 = "'('"; 
     string shouldPass5 = "' content here ' ')'"; 
     string shouldFail = "' content here') ' another content'"; 

     Console.WriteLine("Pass1 : {0}",regex.IsMatch(shouldPass1)); 
     Console.WriteLine("Pass2 : {0}", regex.IsMatch(shouldPass2)); 
     Console.WriteLine("Pass3 : {0}", regex.IsMatch(shouldPass3)); 
     Console.WriteLine("Pass4 : {0}", regex.IsMatch(shouldPass4)); 
     Console.WriteLine("Pass5 : {0}", regex.IsMatch(shouldPass5)); 
     Console.WriteLine("Fail : {0}", regex.IsMatch(shouldFail)); 

     string wholeThing = string.Format(
      "{0}\n{1}\n{2}\n{3}\n{4}\n{5}", 
      shouldPass1, 
      shouldPass2, 
      shouldPass3, 
      shouldPass4, 
      shouldPass5, 
      shouldFail); 

     Console.WriteLine("Alltogether (should fail too): {0}", regex.IsMatch(wholeThing)); 
    } 
} 

O senza Regex (Tim Schmelter sarebbe orgoglioso di me):

private static bool IsMatch(string text) 
{ 
    bool result = text[0] == '\'' && text[text.Length - 1] == '\''; 
    bool opened = false; 

    for (int i = 0; result && i < text.Length; i++) 
    { 
     char currentchar = text[i]; 

     if (currentchar == '\'') 
     { 
      opened = !opened; 
     } 
     if (!opened && (currentchar == '(' || currentchar == ')')) 
     { 
      result = false; 
     } 
    } 

    return result; 
}