2009-04-11 32 views
31

Actualmente estoy tratando de dividir una cadena en C# (última .NET y Visual Studio 2008), para recuperar todo lo que está entre corchetes y descartar el texto restante.C# Regex Split - todo dentro de corchetes

Ej: "antagonista de los receptores H1 [HSA: 3269] [PATH: hsa04080 (3269)]"

En este caso, estoy interesado en conseguir "HSA: 3269" y " RUTA: hsa04080 (3269) "en una matriz de cadenas.

¿Cómo se puede lograr esto?

Respuesta

60

Split no lo ayudará aquí; necesita usar expresiones regulares:

// using System.Text.RegularExpressions; 
// pattern = any number of arbitrary characters between square brackets. 
var pattern = @"\[(.*?)\]"; 
var query = "H1-receptor antagonist [HSA:3269] [PATH:hsa04080(3269)]"; 
var matches = Regex.Matches(query, pattern); 

foreach (Match m in matches) { 
    Console.WriteLine(m.Groups[1]); 
} 

Entrega sus resultados.

+3

¿Le resulta incómodo en 3.5 que el enumerador MatchCollection aún devuelva Match como objeto? – chakrit

+3

de todos modos ... una mejor coincidencia de expresiones regulares podría ser \ [([^ \]] *) \] para estar seguro :-) – chakrit

+0

@chakrit: 1. Sí, pero esto no se puede cambiar por compatibilidad con versiones anteriores razones. Realmente una pena sin embargo. Microsoft debería tener las pelotas para hacer como Python 3: lanzar todo lo anterior a 2.0 para siempre e introducir un cambio radical. Pero esto no sucederá ... –

0

probar este

string mystr = "Hello my name is {robert} and i live in {florida}"; 

List<string> myvariables = new List<string>(); 
while (mystr.Contains("{")) 
{ 
    myvariable.Add(mystr.Split('{', '}')[1]); 
    mystr = mystr.Replace("{" + mystr.Split('{', '}')[1] + "}", ""); 
}; 

De esta manera voy a tener una matriz que contendrá Robert y Florida.

+2

Este código asume que los corchetes siempre coinciden perfectamente (nunca se tiene '}' antes de '{', y nunca se tiene '{' dos veces seguidas. También es muy ineficiente porque divide la cuerda muchas veces innecesariamente. sería mucho más eficiente y robusto para usar Regex como lo hace la otra respuesta. –

Cuestiones relacionadas