2012-05-31 38 views
7

Tôi có một chuỗi có hai hoặc nhiều số. Dưới đây là một vài ví dụ:Sử dụng regex để trích xuất nhiều số từ chuỗi

"(1920x1080)" 
" 1920 by 1080" 
"16 : 9" 

Làm thế nào tôi có thể trích xuất số riêng biệt như "1920" và "1080" từ nó, giả sử họ sẽ chỉ được ngăn cách bởi một hoặc nhiều không phải số ký tự (s)?

+0

Vui lòng quyết định ngôn ngữ nào bạn cần câu trả lời. Các đối tượng regex trong .NET không giống như ngôn ngữ Java. – Oded

+0

@Oded ok, xong. – David

Trả lời

9

Các biểu thức chính quy cơ bản sẽ là:

[0-9]+ 

Bạn sẽ cần phải sử dụng thư viện để đi qua tất cả các trận đấu và nhận được giá trị của họ.

var matches = Regex.Matches(myString, "[0-9]+"); 

foreach(var march in matches) 
{ 
    // match.Value will contain one of the matches 
} 
1
(\d+)\D+(\d+) 

Sau đó, tùy chỉnh regex này để khớp với hương vị của ngôn ngữ bạn sẽ sử dụng.

+0

'\ d' sẽ chứa _all_ chữ số, không chỉ chữ số La Mã, tùy thuộc vào thư viện và nền tảng regex. – Oded

+0

regex .net/C# (và PCRE) '\ d' khớp với [0-9]. Giai đoạn. – dda

+0

Không, không. Nó sẽ khớp với ٠١٢٣٤٥٦٧٨٩ - http://stackoverflow.com/a/6479605/1583 – Oded

1

bạn có thể sử dụng

string[] input = {"(1920x1080)"," 1920 by 1080","16 : 9"}; 
foreach (var item in input) 
{ 
    var numbers = Regex.Split(item, @"\D+").Where(s => s != String.Empty).ToArray(); 
    Console.WriteLine("{0},{1}", numbers[0], numbers[1]); 
} 

OUTPUT:

1920,1080 
1920,1080 
16,9 
+0

tốt, nhưng thường trả về các chuỗi trống thừa. – David

+0

Có, cập nhật, Cảm ơn @David – Damith

5

Bạn có thể lấy chuỗi bằng cách làm theo

MatchCollection v = Regex.Matches(input, "[0-9]+"); 
foreach (Match s in v) 
      { 
       // output is s.Value 
      } 
+0

'RegexOptions.IgnoreCase' là không cần thiết. Chữ số La Mã không có chữ hoa/chữ thường. – Oded

+0

Thông thường tôi thực hành với RegexOptions.IgnoreCase. Xin lỗi vì nhầm lẫn –

+0

Không phải là một sai lầm như vậy. Chỉ cần không cần thiết trong trường hợp này. – Oded

0

Hiện vẫn còn là một vấn đề tuy nhiên, tất cả các câu trả lời trên xem xét 12i hoặc a2 số hợp lệ khi họ sh không thể.

Sau đây có thể giải quyết vấn đề này

var matches = Regex.Matches(input, @"(?:^|\s)\d+(?:\s|$)"); 

Nhưng giải pháp này cho biết thêm một vấn đề nữa :) Điều này sẽ nắm bắt được không gian xung quanh số nguyên. Để giải quyết điều này, chúng tôi cần phải nắm bắt giá trị của số nguyên thành một nhóm:

MatchCollection matches = Regex.Matches(_originalText, @"(?:^|\s)(\d+)(?:\s|$)"); 
HashSet<string> uniqueNumbers = new HashSet<string>(); 
foreach (Match m in matches) 
{ 
    uniqueNumbers.Add(m.Groups[1].Value); 
} 
Các vấn đề liên quan