2012-02-24 26 views
44

Ho una stringa:C# RegEx estrazione stringa

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

Devo estrarre il primo numero (stringa "655") tra "ImageDimension =" e la prima occorrenza di "x"; e occorre estrarre il secondo numero (stringa "0") dopo la prima "x" che si verifica dopo la stringa "ImageDimension =". Simile al terzo e al quarto numero.

questo può essere fatto con espressioni regolari ("ImageDimension = x ;???? ThumbnailDimension = x ") e come? Invece di sottostringhe goffe e indexof? Grazie!

La mia soluzione, che non è bello:

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

Come un caso a parte: si potrebbe rendere molto meno brutta, senza espressioni regolari così, utilizzando String.split(). – Stu

risposta

76

In questo modo ottenere ciascuno dei valori in interi separati per voi:

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

È inoltre possibile rendere la ricerca un po 'più generica con uno schema di: '@" (? \ d +). (? \ d +). *? (? \ d +). (? \ d +) "' –

+0

ci sono delle eccezioni che dovremmo cercare qui? – whossname

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

(\d+) 

ottenere la prima set di una o più cifre. e conservarlo come il primo gruppo catturato dopo che l'intera partita

. 

Trova ogni carattere

(\d+) 

Prendi la prossima serie di una o più cifre. e memorizzarlo come il secondo gruppo catturato dopo l'intera partita

.*? 

partita e il numero di caratteri in modo non avido.

(\d+) 

Ottenere il set successivo di una o più cifre. e conservarlo come il terzo gruppo catturato dopo che l'intera partita

(\d+) 

Prendi la prossima serie di una o più cifre. e memorizzarlo come il quarto gruppo catturato dopo l'intera partita

0

Certo, è abbastanza facile. Il modello regex che stai cercando è:

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

Il primo gruppo della partita è il numero desiderato.

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

Dal momento che molte persone ti hanno già dato quello che volevi, io contribuirò con qualcos'altro. I regex sono difficili da leggere e soggetti a errori.Forse un po 'meno prolissa rispetto l'implementazione, ma più semplice e amichevole rispetto all'utilizzo di espressioni regolari:

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"))); 
    } 
}