2010-01-26 32 views
12

nổi tôi có mô hình này:Regex số khớp với điểm

[0-9]*\.?[0-9] 

Nó phù hợp với số nhưng nó cũng phù hợp với 3.5.4 như:

  1. 3,5
  2. .4

Làm cách nào để khắc phục điều đó (đầu vào này không được khớp)?
UPDATE:
này cũng nên làm việc trên đầu vào: 1 3.5.4 10

1,2. không được phép
.3 được phép

bất kỳ thẻ nào không phải là poart của số không được phép, như: a1 2.4f 3. 45, 67!

+1

Bạn có muốn để phù hợp với '1.23'? Còn về '.3' thì sao? –

+0

Nếu dữ liệu nhập của bạn chứa nhiều kết quả phù hợp, bạn có muốn tất cả chúng không? Đầu vào của bạn có thể chứa bất kỳ thông tin nào khác ngoài dấu chấm, chữ số và dấu cách không? –

+0

vâng, đầu vào có thể có bất kỳ thứ gì – ronik

Trả lời

10

câu trả lời Cập nhật sau khi bình luận từ poster:

Sử dụng lookahead/lookbehind để đảm bảo rằng các nhân vật trước và sau là những không gian:

Dưới đây là một phiên bản phù hợp chặt chẽ của bạn, nhưng điều đó sẽ không làm cho trận đấu phần:

(?:^|(?<=\s))[0-9]*\.?[0-9](?=\s|$) 

Đối với cả những ví dụ, khi chạy trên chuỗi 1 2.3.4 5.6 chỉ khớp với 15.6.

+0

là?: Công cụ sửa đổi có hợp lệ trên tất cả nền tảng không? – ronik

+0

Nhất, vâng. Bạn đang sử dụng nền tảng nào? Giải pháp hiện tại của tôi không sử dụng '?:'. Và ngay cả khi nó đã làm nó luôn luôn là tùy chọn - nó chỉ cải thiện hiệu suất. Vì vậy, nếu nền tảng của bạn không hỗ trợ nó, chỉ cần loại bỏ nó. –

+0

@ronik: Tôi nghĩ câu trả lời của tôi là gần như những gì bạn muốn, nhưng bạn cần trả lời các câu hỏi làm rõ của tôi trước khi tôi có thể tạo ra thứ gì đó chính xác là những gì bạn cần. Xem nhận xét trong câu hỏi của bạn và trả lời cho họ hoặc cập nhật câu hỏi của bạn để bao gồm câu trả lời. –

2

Regex của bạn không được neo. Nếu bạn muốn kết hợp dòng có chứa chỉ số và không có gì khác sử dụng:

^[0-9]*\.?[0-9]$ 
+1

Điều này sẽ không thành công trên 1,23. Tại sao điều này lại được upvoted? – cletus

+0

Anh ấy không _seem_ muốn khớp với '1,23'. (Nhìn vào regex gốc của mình) – SLaks

+0

Có lẽ poster không muốn khớp với '1.23'? Tôi sẽ yêu cầu anh ta làm rõ điểm này. –

1

Bạn không nên sử dụng regex cho điều này trừ khi bạn thực sự cần.

Thay vào đó, bạn nên sử dụng các phương pháp phân tích cú pháp tích hợp sẵn trong ngôn ngữ của mình.

Tôi giả sử từ các câu hỏi khác của bạn rằng bạn đang sử dụng Javascript; nếu có, bạn nên gọi parseFloat.

+0

Tôi biết rằng tôi có thể sử dụng (tôi sử dụng C#), nhưng tôi hỏi về tinh khiết regex – ronik

+2

-1 cho giả định rằng regexps là sai. Các đề xuất thay thế là một điều, nhưng các câu lệnh nhạt nhẽo như "Bạn không nên sử dụng regexp cho điều này trừ khi bạn thực sự cần" bị viêm và không xem xét các ngữ cảnh có thể có cho câu hỏi. –

+0

@PP: Trước khi chỉnh sửa, regexps đã sai cho việc này. 'Trừ khi bạn thực sự cần phải xem xét các bối cảnh cho câu hỏi. – SLaks

7

Bạn phải quyết định xem bạn có muốn chấp nhận các số không có số 0 đứng đầu (ví dụ .123) hay không. Nếu bạn không thì regex là dễ dàng:

^-?[0-9]+(\.[0-9]+)?$ 

Nếu bạn làm thì đó là một chút phức tạp hơn:

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

Cả đoán rằng một dấu thập phân phải được theo sau bởi ít nhất một chữ số. Nếu bạn không chấp nhận số âm thì số -? là không cần thiết.

+0

@cletus: Tôi tính toán lại đại diện của bạn theo yêu cầu. Nó đã thay đổi một lượng nhỏ như vậy, tôi nghĩ tôi nên cho bạn biết. :) –

12

Để phù hợp với một số json:

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

JSON number

Sử dụng regex này để phù hợp .123:

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

Ví dụ này không cho phép '.5'. 'Số' này là JSON cụ thể. – Marius

+0

Đây là một biểu thức cũng sẽ cho phép các điểm thập phân hàng đầu: '[+ \ -]? (?: (?: \ D +) (?: \. \ D *)? | (?: \. \ D +) +) (?: [eE] [+ \ -]? \ d +)? '. Về cơ bản nó nói "hoặc bạn có một chữ số sau đó bạn có thể tùy chọn thêm một dấu thập phân và nhiều chữ số hơn, hoặc bạn bắt đầu với một dấu thập phân, trong trường hợp đó bạn phải có ít nhất một chữ số". – maschu

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