2012-02-24 39 views
44

Tôi có một chuỗi:C# RegEx chuỗi khai thác

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

Tôi phải trích xuất số đầu tiên (chuỗi "655") ở giữa "ImageDimension =" và lần xuất hiện đầu tiên của "x"; và cần trích xuất số thứ hai (chuỗi "0") đến sau "x" đầu tiên xảy ra sau chuỗi "ImageDimension =". Tương tự với số thứ ba và thứ tư.

này có thể được thực hiện với regex ("ImageDimension = x ;?? ThumbnailDimension = x ") và làm thế nào? Thay vì chất nền vụng về và indexof? Cảm ơn bạn!

Giải pháp của tôi mà không phải là đẹp:

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

Là một ngẫu nhiên sang một bên: bạn có thể làm cho nó ít nhiều xấu xí mà không biểu thức thông thường là tốt, sử dụng String.split(). – Stu

Trả lời

76

này sẽ nhận được mỗi người trong số các giá trị vào ints riêng biệt dành cho bạn:

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

Bạn cũng có thể thực hiện tìm kiếm chung chung hơn một chút với mẫu: '@" (? \ d +). (? \ d +). *? (? \ d +). (? \ d +) "' –

+0

có bất kỳ ngoại lệ nào chúng ta nên tìm kiếm ở đây không? – whossname

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

(\d+) 

Lấy đầu tiên đặt một hoặc nhiều chữ số. và lưu nó như nhóm bắt đầu kể từ khi toàn bộ trận đấu

. 

trận đấu bất kỳ ký tự

(\d+) 

Lấy tập tiếp theo của một hoặc nhiều chữ số. và lưu nó thành nhóm thứ hai được chụp sau toàn bộ trận đấu

.*? 

khớp và số ký tự bất kỳ theo cách không tham lam.

(\d+) 

Nhận tập hợp tiếp theo của một hoặc nhiều chữ số. và lưu trữ nó làm nhóm thứ ba được chụp sau toàn bộ trận đấu

(\d+) 

Lấy tập hợp tiếp theo của một hoặc nhiều chữ số. và lưu nó dưới dạng nhóm được chụp thứ tư sau toàn bộ trận đấu

0

Chắc chắn, nó khá dễ dàng. Mẫu regex bạn đang tìm kiếm là:

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

Nhóm đầu tiên trong khớp là số bạn muốn.

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

Vì nhiều người đã cung cấp cho bạn những gì bạn muốn, tôi sẽ đóng góp một thứ khác. Regexes khó đọc và dễ bị lỗi.Có lẽ một chút ít tiết hơn thực hiện của bạn, nhưng đơn giản hơn và thân thiện hơn là sử dụng 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"))); 
    } 
}