2012-06-06 30 views
7

Tôi cần một biểu thức regex mà sẽ phù hợp với những điều sau đây:Regex số phù hợp và số thập phân

.5 
0.5 
1.5 
1234 

nhưng KHÔNG

0.5.5 
absnd (any letter character or space) 

Tôi có điều này thỏa mãn tất cả nhưng 0.5.5

^[.?\d]+$ 
+0

Câu trả lời tốt nhất, chứ không phải một bài báo nghiên cứu là ở đây: https://stackoverflow.com/a/39399503/715269 – Gangnus

Trả lời

18

Đây là một nhiệm vụ khá phổ biến. Cách đơn giản nhất tôi biết để đối phó với nó là thế này:

^[+-]?(\d*\.)?\d+$ 

Ngoài ra còn có các biến chứng khác, chẳng hạn như việc bạn muốn cho phép zero hoặc dấu phẩy hoặc những thứ tương tự hàng đầu. Điều này có thể phức tạp như bạn muốn. Ví dụ, nếu bạn muốn cho phép định dạng 1,234,567.89, bạn có thể đi với điều này:

^[+-]?(\d*|\d{1,3}(,\d{3})*)(\.\d+)?\b$ 

Đó \b có một break từ, nhưng tôi đang sử dụng nó như là một cách lén lút để đòi hỏi ít nhất một chữ số ở cuối chuỗi. Bằng cách này, một chuỗi rỗng hoặc một đơn + sẽ không khớp.

Tuy nhiên, lưu ý rằng regexes không phải là cách lý tưởng để phân tích cú pháp chuỗi số. Tất cả các ngôn ngữ lập trình hiện đại mà tôi biết có phương pháp nhanh, đơn giản, tích hợp để thực hiện điều đó.

+1

+1 cho "phương pháp tích hợp" đoạn – niko

+0

Dịch vụ chăm sóc người quản lý có chia sẻ không? –

+0

Có vẻ như chúng tôi có một trò lừa đảo xung quanh những phần này. Tôi đã downvoted quá. –

1

Điều này có thể hoạt động:

^(?:\d*\.)?\d+$ 
+1

Điều này đòi hỏi một điểm thập phân. –

+0

Có, tôi khớp \ d * trong dấu ngoặc đơn, không phải \ d + – niko

+0

Có vẻ OK ngay bây giờ. Tôi đã nhận xét trước khi bạn thêm '?'. –

3

Sau đây nên làm việc:

^(?!.*\..*\.)[.\d]+$ 

này sử dụng một lookahead tiêu cực để đảm bảo rằng có ít hơn hai . ký tự trong chuỗi.

http://www.rubular.com/r/N3jl1ifJDX

+0

Điều này chạy qua chuỗi hai lần, mặc dù. –

+0

Tại sao bạn muốn làm cho nó phức tạp? –

+3

Tyler và Justin - Tôi đồng ý rằng phương pháp của bạn là tốt hơn, nhưng sẽ để lại điều này như là một thay thế. Phương pháp lookahead là tốt đẹp để kiểm tra nhiều điều kiện như thế này (ví dụ như trong xác nhận mật khẩu), nhưng nó làm phức tạp hơn một cái gì đó đơn giản như thế này, thưởng thức một +1! –

10

Không ai có vẻ đang tính số âm. Ngoài ra, một số người đang tạo nhóm chụp không cần thiết. Đây là giải pháp toàn diện nhất IMO.

^[+-]?(?:\d*\.)?\d+$ 

EDIT: Tại sao lưu ý?

+0

Có vẻ ổn với tôi, có một sự thăng hoa. –

+2

* liên hệ để bắt tay * –

2

Dưới đây là một giải pháp đơn giản hơn nhiều mà không sử dụng bất kỳ look-aheads hoặc tìm-behinds:

^\d*\.?\d+$ 

Để hiểu rõ lý do tại sao các công trình này, đọc nó từ phải sang trái:

  • Yêu cầu ít nhất một chữ số ở cuối.
    7 làm việc
    77 làm việc
    .77 làm việc
    0.77 làm việc
    0. không hoạt động
    chuỗi rỗng không hoạt động
  • Một dấu chấm trước chữ số là tùy chọn .
    .77 làm việc
    77 công trình
    ..77 không hoạt động
  • Bất kỳ số lượng chữ số trước (không bắt buộc) kỳ. .77 công trình
    0.77 làm việc
    0077.77 làm việc
    0077 làm việc

Không sử dụng look-aheads và tìm kiếm-behinds đã lợi ích bổ sung không phải lo lắng về các cuộc tấn công DOS RegEx-based.

HTH

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