2012-02-24 11 views
44

que tienen una cadena:extracción cadena de C# RegEx

"ImageDimension = 655x0; ThumbnailDimension = 0x0".

Tengo que extraer el primer número ("655" cadena) entre "ImageDimension =" y la primera aparición de "x"; y necesita extraer el segundo número (cadena "0") después de la primera "x" que aparece después de la cadena "ImageDimension =". Similar con los números tercero y cuarto.

se puede hacer esto con expresiones regulares ("ImageDimension = x ;???? ThumbnailDimension = x ") y cómo? ¿En lugar de subcadenas e índices torpes? ¡Gracias!

Mi solución que no es agradable:

String configuration = "ImageDimension=655x0;ThumbnailDimension=0x0"; 
String imageDim = configuration.Substring(0, configuration.IndexOf(";")); 
int indexOfEq = imageDim.IndexOf("="); 
int indexOfX = imageDim.IndexOf("x"); 

String width1 = imageDim.Substring(indexOfEq+1, indexOfX-indexOfEq-1); 
String height1 = imageDim.Substring(imageDim.IndexOf("x") + 1); 

String thumbDim = configuration.Substring(configuration.IndexOf(";") + 1); 
indexOfEq = thumbDim.IndexOf("="); 
indexOfX = thumbDim.IndexOf("x"); 

String width2 = imageDim.Substring(indexOfEq + 1, indexOfX - indexOfEq-1); 
String height2 = imageDim.Substring(imageDim.IndexOf("x") + 1); 
+1

Como aleatoria a un lado: usted puede hacer que sea mucho menos feo y sin expresiones regulares, y se utilizan string.split(). – Stu

Respuesta

76

Esto hará que cada uno de los valores en enteros separados por usted:

string text = "ImageDimension=655x0;ThumbnailDimension=0x0"; 
Regex pattern = new Regex(@"ImageDimension=(?<imageWidth>\d+)x(?<imageHeight>\d+);ThumbnailDimension=(?<thumbWidth>\d+)x(?<thumbHeight>\d+)"); 
Match match = pattern.Match(text); 
int imageWidth = int.Parse(match.Groups["imageWidth"].Value); 
int imageHeight = int.Parse(match.Groups["imageHeight"].Value); 
int thumbWidth = int.Parse(match.Groups["thumbWidth"].Value); 
int thumbHeight = int.Parse(match.Groups["thumbHeight"].Value); 
+1

También podría hacer la búsqueda un poco más genérica con un patrón de: '@" (? \ d +). (? \ d +). *? (? \ d +). (? \ d +) "' –

+0

¿hay alguna excepción que debamos tener en cuenta aquí? – whossname

7
var m = Regex.Match(str,@"(\d+).(\d+).*?(\d+).(\d+)"); 
m.Groups[1].Value; // 655 .... 

(\d+) 

obtener el primer conjunto de uno o más dígitos y almacenarlo como el primer grupo capturado después de todo el partido

. 

cualquier carácter

(\d+) 

Obtener el siguiente conjunto de uno o más dígitos. y almacenarlo como el segundo grupo capturado después de todo el partido

.*? 

partido y el número de caracteres de una manera no codicioso.

(\d+) 

Obtenga el siguiente conjunto de uno o más dígitos. y almacenarlo como el tercer grupo capturado después de la coincidencia completa

(\d+) 

Obtenga el siguiente conjunto de uno o más dígitos. y lo almacena como el cuarto grupo capturado después de todo el partido

0

Claro, es bastante fácil. El patrón de expresiones regulares que está buscando es:

^ImageDimension=(\d+)x0;.+$ 

El primer grupo del partido es el número que desea.

9
var groups = Regex.Match(input,@"ImageDimension=(\d+)x(\d+);ThumbnailDimension=(\d+)x(\d+)").Groups; 
var x1= groups[1].Value; 
var y1= groups[2].Value; 
var x2= groups[3].Value; 
var y2= groups[4].Value; 
1

Dado que mucha gente ya te dio lo que querías, contribuiré con algo más. Los regex son difíciles de leer y propensos a errores.Tal vez un poco menos detallado que no sea su aplicación, pero más sencillo y agradable de utilizar expresiones regulares:

private static Dictionary<string, string> _extractDictionary(string str) 
{ 
    var query = from name_value in str.Split(';') // Split by ; 
       let arr = name_value.Split('=')  // ... then by = 
       select new {Name = arr[0], Value = arr[1]}; 

    return query.ToDictionary(x => x.Name, y => y.Value); 
} 

public static void Main() 
{ 
    var str = "ImageDimension=655x0;ThumbnailDimension=0x0"; 
    var dic = _extractDictionary(str); 

    foreach (var key_value in dic) 
    { 
     var key = key_value.Key; 
     var value = key_value.Value; 
     Console.WriteLine("Value of {0} is {1}.", key, value.Substring(0, value.IndexOf("x"))); 
    } 
} 
Cuestiones relacionadas