2009-11-28 83 views

Respuesta

16

Puede hacer esto con expresiones regulares y un poco de Linq.

string s = "test [4df] test [5y" + Environment.NewLine + "u] test [6nf]"; 

    ICollection<string> matches = 
     Regex.Matches(s.Replace(Environment.NewLine, ""), @"\[([^]]*)\]") 
      .Cast<Match>() 
      .Select(x => x.Groups[1].Value) 
      .ToList(); 

    foreach (string match in matches) 
     Console.WriteLine(match); 

Salida:

4df 
5yu 
6nf 

Esto es lo que significa la expresión regular:

\[ : Match a literal [ 
( : Start a new group, match.Groups[1] 
[^]] : Match any character except ] 
* : 0 or more of the above 
) : Close the group 
\] : Literal ] 
+0

Excelente, realmente genial. – Ravia

+0

Gracias por la respuesta, he estado jugando pero no puedo gestionarlo. ¿Cómo cambiaría la expresión regular para que incluyera los paréntesis? –

3
Regex regex = new Regex(@"\[[^\]]+\]", RegexOptions.Multiline); 
+0

@ "\ [([^]] *) \]" parece ser un patrón favorito. –

1

Th La tecla e es para escapar correctamente de los caracteres especiales utilizados en las expresiones regulares; por ejemplo, puede hacer coincidir un carácter [ de esta manera: @"\["

0
Regex rx = new Regex(@"\[.+?\]"); 
var collection = rx.Matches(s); 

Tendrá que recortar los corchetes fuera, la parte importante es el operador perezoso .

+0

No funcionará en varias líneas, incluso si especifica RegexOptions.Multiline (lo sé, lo intenté;)) –

+0

Funciona a través de la línea de múltiplos bien para mí –

+0

Puede usar Regex.SingleLine: esto casi funciona, excepto que captura los \ n's también. De hecho, es probable que incluso tenga un rendimiento un poco mejor que la solución que presenté, ya que solo necesita reemplazar las partes capturadas de la cuerda en lugar de la cadena completa. –

Cuestiones relacionadas