2012-02-24 15 views
44

मैं एक स्ट्रिंग है:सी # रेगुलर एक्सप्रेशन से स्ट्रिंग निष्कर्षण

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

मुझे "ImageDimension =" और "x" की पहली घटना के बीच आने वाली पहली संख्या ("655" स्ट्रिंग) निकालना है; और "ImageDimension =" स्ट्रिंग के बाद होने वाले पहले "x" के बाद आने वाले दूसरे नंबर ("0" स्ट्रिंग) को निकालने की आवश्यकता है। तीसरी और चौथी संख्या के साथ ही। ("???? ThumbnailDimension = एक्स ImageDimension = एक्स ") और कैसे

इस regex के साथ किया जा सकता है? बेकार substrings और सूचकांक के बजाय? धन्यवाद!

मेरे समाधान जो अच्छा नहीं है:

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

एक यादृच्छिक अलग रूप में: क्या आप इसे भी बहुत कम नियमित अभिव्यक्ति के बिना बदसूरत बना सकता है, string.Split का उपयोग कर()। – Stu

उत्तर

76

यह आपके लिए अलग ints में से प्रत्येक मान के मिल जाएगा:

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

आप खोज को थोड़ा अधिक सामान्य बना सकते हैं: '@ "(? \ d +)। (? \ d +)। *? (? \ d +)। (? \ d +)" –

+0

क्या कोई अपवाद है जो हमें यहां देखना चाहिए? – whossname

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

(\d+) 

पहले जाओ एक या अधिक अंकों का सेट। और पूरे मैच

. 

मैच किसी भी चरित्र

(\d+) 

के बाद पहले कब्जा कर लिया समूह के रूप में संग्रहीत एक या अधिक संख्याएं के अगले सेट प्राप्त करें। और पूरे मैच

.*? 

मिलान और गैर लालची फैशन में किसी भी पात्र की संख्या के बाद इसे दूसरे कब्जे वाले समूह के रूप में संग्रहीत करें।

(\d+) 

एक या अधिक अंकों का अगला सेट प्राप्त करें। और पूरे मैच

(\d+) 

एक या अधिक संख्याएं के अगले सेट जाओ के बाद तीसरे पर कब्जा कर लिया समूह के रूप में संग्रहीत। और इसे पूरे मैच के बाद चौथे कब्जे वाले समूह के रूप में स्टोर करें

0

निश्चित रूप से, यह बहुत आसान है। रेगेक्स पैटर्न जो आप खोज रहे हैं वह है:

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

मैच में पहला समूह वह नंबर है जो आप चाहते हैं।

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

चूंकि बहुत से लोगों ने आपको पहले ही जो कुछ भी दिया था, मैं कुछ और के साथ योगदान दूंगा। Regexes पढ़ने और त्रुटि प्रवण मुश्किल है।हो सकता है कि एक छोटे से कम अपने कार्यान्वयन से वर्बोज़ लेकिन और अधिक सरल और regex का उपयोग करने से अनुकूल:

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"))); 
    } 
} 
संबंधित मुद्दे