2016-09-29 9 views
5

Tôi có một chuỗi mẫu '((1/1000)*2375.50)'NET REGEX Nhận Integer ONLY, loại trừ DECIMAL WHOLE

tôi muốn nhận được 1 đến 1000 mà là một INT

tôi đã cố gắng biểu thức regex này:

  • -?\d+(\.\d+)? => này phù hợp 1, 1000, and 2375.50
  • -?\d+(?!(\.|\d+)) => này phù hợp 1, 1000, and 50
  • -?\d+(?!\.\d+&(?![.]+[0-9]))? =>1, 1000, 2375, and 50

Tôi phải sử dụng biểu thức nào để khớp (1 and 1000)?

+0

Tất cả chuỗi đầu vào của bạn có định dạng '((x/y) * z)' không? – Chrono

+1

@ Chrono: Không, đó chỉ là một chuỗi mẫu. Bất kỳ chuỗi nào sẽ làm –

Trả lời

4

Vì vậy, về cơ bản bạn cần phải phù hợp trình tự của các chữ số mà không phải là trước hoặc theo sau là một dấu thập phân hoặc chữ số khác? Tại sao không thử điều đó?

[TestCase("'((1/1000)*2375.50)'", new string[] { "1", "1000" })] 
[TestCase("1", new string[] { "1" })] 
[TestCase("1 2", new string[] { "1", "2" })] 
[TestCase("123 345", new string[] { "123", "345" })] 
[TestCase("123 3.5 345", new string[] { "123", "345" })] 
[TestCase("123 3. 345", new string[] { "123", "345" })] 
[TestCase("123 .5 345", new string[] { "123", "345" })] 
[TestCase(".5-1", new string[] { "-1" })] 
[TestCase("0.5-1", new string[] { "-1" })] 
[TestCase("3.-1", new string[] { "-1" })] 
public void Regex(string input, string[] expected) 
{ 
    Regex regex = new Regex(@"(?:(?<![.\d])|-)\d+(?![.\d])"); 
    Assert.That(regex.Matches(input) 
      .Cast<Match>() 
      .Select(m => m.ToString()) 
      .ToArray(), 
     Is.EqualTo(expected)); 
} 

Dường như hoạt động.

+0

HOẠT ĐỘNG MẪU CỦA BẠN NHƯ MỘT CHARM, HOẠT ĐỘNG BẤT K STRING STRING –

+0

@Bienvenido, vâng, trước hết, Một điều nữa, như Kobi đã lưu ý, tôi hoàn toàn quên mất dấu trừ, xem bản chỉnh sửa của tôi –

1

Try this:

string pattern = @"\(\(([\d]+)\/([\d]+)\)\*"; 
    string input = @"'((1/1000)*2375.50)'"; 


    foreach (Match match in Regex.Matches(input, pattern)) 
    { 
    Console.WriteLine("{0}", match.Groups[1].Value); 
    Console.WriteLine("{0}", match.Groups[2].Value); 

    }   
+0

Tahnks cho câu trả lời. Tôi đã thử nó, nhưng mẫu phù hợp với '((1/1000) *' tôi chỉ muốn 1 và 1000 –

+0

bạn có thể thử ngay bây giờ –

3

Bạn có thể sử dụng:

(?<!\.)-?\b\d+\b(?!\.) 

Working example

  • (?<!\.) - Không thời gian trước số.
  • -? - Dấu trừ tùy chọn
  • \b\d+\b - Số. Được bao bọc trong một ranh giới từ, vì vậy sẽ không thể khớp với một số khác (ví dụ: không khớp với 1234 trong 12345.6). Điều này sẽ không khớp với 2 trong 2pi.
  • (?!\.) - Không có dấu chấm sau số.
+0

Tốt hơn tôi vì bạn có dấu trừ và các số nguyên có thể là một phần của một mã định danh –

+0

@ SergeyTachenov - Thanks! Dấu trừ là một phần của câu hỏi (tất cả các mẫu bắt đầu bằng '-?') .Điều '2pi' có thể là một lỗi trên mẫu của tôi, chúng ta có thể muốn khớp các số nguyên này. – Kobi

+1

Ah, tôi đã bỏ dấu trừ bằng cách này, bạn có một lỗi với nó trừ ở đây.Trong một chuỗi như '" 3.-1 "', bạn sẽ không phù hợp với '" -1 "'. –

Các vấn đề liên quan