2012-06-13 57 views
18

Xin chào Tôi muốn khớp một số nhỏ hơn hoặc bằng 100, có thể là bất kỳ thứ gì trong vòng 0-100, nhưng regex không được khớp với số lớn hơn 100 như 120 130,150,999, v.v.cách khớp một số nhỏ hơn hoặc bằng 100?

+2

Làm thế nào về '0.5' hoặc '1e2'? Những trận đấu đó phải không? Còn về '0000001' thì sao? –

+6

Tại sao bạn muốn sử dụng regex cho điều này? Perl đã có các toán tử so sánh Boolean hoàn toàn có ích (<, <=, ==, >,> =). –

+1

Như Dave đã nói, bạn có chắc chắn muốn biểu hiện chính quy không? Perl sẽ coi một biến như một chuỗi hoặc một số có thể hoán đổi cho nhau, và bạn có thể viết 'if ($ num> = 0 và $ num <= 100) {...}' – Borodin

Trả lời

0

regex cho điều này

perl -le 'for (qw/0 1 19 32.4 100 77 138 342.1/) { print "$_ is ", /^(?:100|\d\d?)$/ ? "valid input" : "invalid input"}' 
6

Làm thế nào về vấn đề này cho các regex:

^([0-9]|[1-9][0-9]|100)$ 

này sẽ xác nhận 7, 82, 100 cho ví dụ, nhưng sẽ không xác nhận 07 hoặc 082.

Check this out để biết thêm thông tin (và các biến thể bao gồm zero prefixing) trên phạm vi số kiểm tra


Nếu bạn cần để phục vụ cho số dấu chấm động bạn nên read this, đây là một biểu hiện bạn có thể sử dụng:

điểm nổi: ^[-+]?([0-9]|[1-9][0-9]|100)*\.?[0-9]+$

36

Hãy thử điều này

\b(0*(?:[1-9][0-9]?|100))\b 

Giải thích

" 
\b    # Assert position at a word boundary 
(    # Match the regular expression below and capture its match into backreference number 1 
    0    # Match the character “0” literally 
     *   # Between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
    (?:   # Match the regular expression below 
        # Match either the regular expression below (attempting the next alternative only if this one fails) 
     [1-9] # Match a single character in the range between “1” and “9” 
     [0-9] # Match a single character in the range between “0” and “9” 
      ?  # Between zero and one times, as many times as possible, giving back as needed (greedy) 
     |   # Or match regular expression number 2 below (the entire group fails if this one fails to match) 
     100  # Match the characters “100” literally 
    ) 
) 
\b    # Assert position at a word boundary 
" 

Visit here cho các vấn đề trong tương lai.

+5

+1 cho giải thích – Dave

+4

liên kết bạn cung cấp bị giới hạn bởi yêu cầu tên người dùng và mật khẩu! – goseo

+0

Tuyệt vời! Cảm ơn lời giải thích. –

3

Sử dụng Mã Khẳng định nếu bạn cần một regex (cuối cùng):

/^(.+)$(??{$^N>=0 && $^N<=100 ? '':'^'})/ 

Test:

my @nums = (-1, 0, 10, 22, 1e10, 1e-10, 99, 101, 1.001e2); 

print join ',', grep 
       /^(.+)$(??{$^N>=0 && $^N<=100 ? '':'^'})/, 
       @nums 

Kết quả:

0,10,22,1e-010,99 

(==>Here is sth. to learn about code assertions).

+0

đã cố gắng xem liên kết nhưng vẫn không hiểu được regexp. Bạn có nghĩ rằng bạn có thể giải thích nó? (đặc biệt là ---? '': '^' --- phần – taiko

0

regex này phù hợp với số 0-100 nhịp điệu và không cho phép con số như 001:

\b(0|[1-9][0-9]?|100)\b 
0

Lời khuyên thiết thực của tôi.

Cá nhân, tôi sẽ kiềm chế viết một regex phức tạp như vậy. Điều gì sẽ xảy ra nếu số của bạn thay đổi từ 100 đến 200 trong tương lai gần. Regex của bạn sẽ phải thay đổi đáng kể và thậm chí có thể khó viết hơn. Tất cả các giải pháp trên KHÔNG tự giải thích và bạn sẽ phải bổ sung nó với một bình luận trong mã của bạn. Đó là một mùi.

Các vấn đề về khả năng đọc. Mã dành cho con người chứ không phải cho máy móc.

Tại sao không viết một số mã xung quanh nó và giữ cho regex chết đơn giản để hiểu.

0

này phù hợp với 0 để 100

^0*([0-9]|[1-8][0-9]|9[0-9]|100)$ 
Các vấn đề liên quan