2012-05-09 26 views
7

Tôi đã có regexp này "^[0-9]+\.?[0-9]*$") để khớp với số kép hoặc số nguyên trong hình ảnh C++ nhưng dường như không hoạt động. bất kỳ ý tưởng nào. đây là cách tôi đang áp dụng mã:Regexp cho một đôi

if (System::Text::RegularExpressions::Regex::IsMatch(e0, "^[0-9]+\.?[0-9]*$")) 
      { 
       e0_val = System::Convert::ToDouble(e0); 
      } 
+2

Tại sao bạn nghĩ nó không hoạt động? Cho một ví dụ. –

+0

@AndrewLogvinov +1, "không hoạt động gimme teh codez" không phải là một dạng câu hỏi hay. –

+0

Khoảng trắng ở đầu hoặc cuối có lẽ? Bạn có thể đăng mã đang sử dụng nó không? –

Trả lời

9

Không có gì sai với regex mỗi khi nói, đó là thoát của bạn có lỗi. Bạn cần phải thoát khỏi ký tự \ vì đó cũng là ký tự thoát chuỗi C++.

Bổ sung có trường hợp cạnh mà regex này nghĩ rằng 1. là số con trỏ thả nổi hợp lệ. Vì vậy, bạn có thể tốt hơn với /^[0-9]+(\\.[0-9]+)?$ mà loại bỏ khả năng đó.

2

regexp ở trên không hoàn hảo vì nó chấp nhận "09" không phải là số hợp lệ. một biểu hiện tốt hơn sẽ là:

"^(-?)(0|([1-9][0-9]*))(\\.[0-9]+)?$" 

nơi: "(. \ [0-9] * [1-9])?"

1. is an optional negative sign; 
2. is zero or a valid non-zero integer; 
4. is the optional fracture part; 

về mặt lý thuyết, phần gãy xương nên được viết như sau Thay vào đó, , bởi vì một số không được có số 0. trong thực tế, chuỗi nguồn có thể đã được tạo bằng một số chữ số cố định, ví dụ:

printf("%.1f", x); 

để có thể dễ dàng kết thúc bằng ký tự không. và, tất nhiên, đây là tất cả các đại diện điểm cố định, không phải là bản thân đôi. một số kép có thể cũng được viết là -1.23e-4 thay vì -0.000123.