2012-01-27 47 views
49

Áp dụng xác thực cho mô hình trong MVC và muốn thực hiện bằng Regex.Cụm từ thông dụng cho bất kỳ số nào lớn hơn 0?

Tìm cách xác thực rằng ID trên mô hình của tôi lớn hơn 0 khi gửi.

Tôi không quen với Regex ... ai đó có thể giúp tôi không?

Cảm ơn

+4

Tại sao nó phải là một biểu thức chính quy? Đó là một công cụ tồi để sử dụng cho công việc này – Gareth

+5

Gareth, trong một số trường hợp, phân tích google cho phép bạn chỉ sử dụng regex hoặc đối sánh chính xác ;-) – Skuta

Trả lời

104

Tôi không biết làm thế nào MVC là có liên quan, nhưng nếu ID của bạn là một số nguyên, BRE này nên làm:

^[1-9][0-9]*$ 

Nếu bạn muốn kết hợp các số thực (nổi) chứ không phải so với số nguyên, bạn cần xử lý trường hợp trên, cùng với số thập phân thông thường (ví dụ: 2.5 hoặc 3.3̅), trường hợp mẫu của bạn nằm trong khoảng từ 0 đến 1 (ví dụ: 0.25), cũng như trường hợp của bạn có phần thập phân 0. (ví dụ: 2.0). Và trong khi chúng tôi đang ở đó, chúng tôi sẽ hỗ trợ thêm cho số không hàng đầu về số nguyên (ví dụ: 005):

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

Lưu ý rằng một thứ hai này là một RE Extended. Điều tương tự có thể được thể hiện trong RE cơ bản, nhưng hầu như mọi thứ đều hiểu được ERE những ngày này. Hãy chia biểu thức thành các phần dễ tiêu hóa hơn.

^(

Dấu mũ khớp với dấu null ở đầu dòng, vì vậy trước regex của bạn bằng dấu mũ sẽ đặt đầu dòng. Dấu ngoặc mở có ở đó vì thanh hoặc bên dưới. Thêm về điều đó sau.

 0*[1-9][0-9]*(\.[0-9]+)? 

này phù hợp với bất kỳ số nguyên hoặc bất kỳ số dấu chấm động trên 1. Vì vậy, chúng tôi 2.0 sẽ được xuất hiện, nhưng 0.25 sẽ không được. Các 0* lúc bắt đầu xử lý số 0 hàng đầu, vì vậy 005 == 5.

       | 

Nhân vật ống là một "hoặc thanh" trong bối cảnh này. Với mục đích đánh giá biểu thức này, nó có ưu tiên cao hơn mọi thứ khác, và kết hợp hiệu quả hai biểu thức chính quy với nhau. Dấu ngoặc đơn được sử dụng để nhóm nhiều biểu thức được phân tách bằng các thanh hoặc.

Và phần thứ hai:

       0+\.[0-9]*[1-9][0-9]* 

này phù hợp với bất kỳ con số đó bắt đầu với một hoặc nhiều 0 nhân vật (thay thế + với * để phù hợp với số không hay nhiều số không, tức là .25), tiếp theo là một khoảng thời gian, sau đó bởi một chuỗi các chữ số bao gồm ít nhất một chữ số không phải là số 0. Điều này khớp với mọi thứ ở trên 0 và bên dưới 1.

            )$ 

Và cuối cùng, chúng tôi đóng ngoặc đơn và neo regex vào cuối dòng bằng ký hiệu đô la, giống như dấu mũ giữa đầu dòng.Tất nhiên, nếu bạn để ngôn ngữ lập trình của mình đánh giá một cái gì đó bằng số thay vì cố gắng so khớp nó với một cụm từ thông dụng, bạn sẽ tiết kiệm được nhức đầu CPU.

+1

Xin chào. vấn đề: 123asd, 123.12kasdf –

+1

@ Vineet'DEVIN'Dev của mình đã được giải quyết. (Cảm ơn, btw.) RE bây giờ bao gồm kèm theo dấu ngoặc đơn, như hầu hết các trình phân tích cú pháp xuất hiện để cân nặng hoặc thanh cao hơn các neo rỗng. – ghoti

+0

hi ghoti, tôi có thể cho phép dấu phẩy trong mẫu sau đây^(0 * [1-9] [0-9] * (\. [0-9] +)? | 0 + \. [0-9] * [ 1-9] [0-9] *) $. ví dụ như: 1000.00 là 1,000.00 và 12324.56 là 12,324.56 – Paresh3489227

11

gì về điều này: ^[1-9][0-9]*$

+0

Bạn không xem xét số âm. – m0skit0

+5

@ m0skit0 và bạn không xem xét câu hỏi: '" Tìm cách xác thực rằng ID trên mô hình của tôi lớn hơn 0 khi gửi. "' –

+0

Có, anh ấy đang tìm ** xác thực ** đầu vào lớn hơn 0 regex này. Điều này không xác nhận điều đó. Nó chỉ xác nhận nó không phải là 0. – m0skit0

1

có bạn đi:

MatchCollection myMatches = Regex.Matches(yourstring, @"[1-9][0-9]*"); 

trên trình:

if(myMatches.Count > 0) 
{ 
    //do whatever you want 
} 
+0

Điều đó sẽ không khớp với 1024. – 0605002

+0

câu trả lời đã được sửa ... – SolidSnake

+0

Bạn không xem xét số âm. – m0skit0

-6

câu trả lời Rất đơn giản để sử dụng này này: \ d *

+6

Điều đó cũng sẽ khớp với 0, 00, 000, 0000, v.v. – perh

-4

^\ $? ([1-9] {1} [0-9] {0,2} (\, [0-9] {3}) * (. [0-9] {0,2})? | [1-9] {1} [0-9] {0,} (. [0-9] {0,2})? | 0 (. [0-9] {0,2})? | (. [0-9] {1,2})?) $

+3

Không chắc chắn nếu bạn đọc câu hỏi rất hay. –

1

I Tried này và nó làm việc cho tôi cho tất cả các số thập phân/số nguyên lớn hơn zero

Cho phép khoảng trắng: ^\s*(?=.*[1-9])\d*(?:\.\d{1,2})?\s*$

Không gian trắng: ^(?=.*[1-9])\d*(?:\.\d{1,2})?$

tham khảo: Regex greater than zero with 2 decimal places

0

Bạn có thể sử dụng biểu thức bên dưới:

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

Mục nhập hợp lệ: 1 1. 1.1 1.0 tất cả các số thực dương

Mục nhập không hợp lệ: tất cả các số thực âm và 0 và 0.0

-2

Tôi nghĩ rằng đây hoàn toàn có thể làm việc:

([1-9][0-9]*(\.[0-9]*[1-9])?|0\.[0-9]*[1-9]) 

hợp lệ:

1 
1.2 
1.02 
0.1 
0.02 

Không áp dụng:

0 
01 
01.2 
1.10 
+0

Zota, tiêu chí trong câu hỏi là xác thực một số "* lớn hơn 0 *". Trong khi tôi tự do thừa nhận tôi không phải là một nhà toán học, tôi khá chắc chắn rằng tất cả các kết quả "không hợp lệ" của bạn ngoại trừ kết quả đầu tiên sẽ đánh giá lớn hơn không. – ghoti

+0

Cũng cho tôi biết khi nào là lần cuối cùng khi bạn sử dụng 0 trước bất kỳ số nào khác, bạn không đếm số 01 02 03 04 ... không phải 1.100 vì số 0 sau là khá không cần thiết .. Tôi buộc bộ não của tôi trong 2 giờ xây dựng regex cho một người có thể cần nó như tôi, và hiệu lực đề cập đến chỉ regex đó .. Cảm ơn bạn đã phản hồi của bạn ngay cả khi nó là một troll một .. –

+1

LOL !!! * "Nói, 1.10 lớn hơn 0" * --- * "CÁI GÌ! Tôi siết chặt bộ não của tôi trong 2 giờ! Bạn đang troll!" * – Xen2050

1

Nếu bạn chỉ muốn các số nguyên không âm, hãy thử: ^\d+$

-2
[1-9]\.\d{1,2}|0\.((0?[1-9])|([1-9]0?)){1,2}\b 
+3

Một lời giải thích sẽ rất tuyệt. – cst1992

2

Tôi nghĩ rằng giải pháp tốt nhất là thêm dấu + giữa hai dấu ngoặc của biểu thức regex:

^[1-9]+[0-9]*$ 
+1

Bạn chắc chắn rằng điều này làm bất cứ điều gì gần với những gì OP muốn? Và tại sao “[1-9] + [0-9] *' kém hiệu quả hơn thay vì câu trả lời được chấp nhận? –

0

Câu trả lời đơn giản r là: ^[1-9][0-9]*$

+0

Giá trị gia tăng cho các câu trả lời khác là gì? – Toto

+0

Tôi chỉ đơn giản là tìm kiếm nó cho công việc khẩn cấp của tôi và thời gian đầu của tôi gần như trống rỗng, sau đó tôi nhận bài này nhưng mọi câu trả lời ở đây là phức tạp, có thể cho những người cấp trên cần nó. Nhưng tôi cần một giải pháp đơn giản, không phải là một giải pháp phức tạp. Vì vậy, tôi chỉ cần thêm nó cho một người như tôi có thể nhận được sự giúp đỡ. –

+0

Đây chính xác là dòng đầu tiên của câu trả lời được chấp nhận. – Toto

0

Một giải pháp:

^[1-9]\d*$ 

\d tương đương với [0-9]

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