2009-07-27 32 views

Trả lời

17

này nên làm việc:

([1-9]|1[012]):[0-5][0-9] 
+0

Điều này sẽ khớp với 0:59. – Brian

+0

Tôi đã sửa nó. – Brian

+1

Lưu ý rằng số này khớp với "3:00" trong "13:00". – Cide

1

Như thế này: ((?:1[0-2]|0\d)\:(?:[0-5]\d)) nếu bạn muốn nhập số 0 đầu cho giờ, ((?:1[0-2]|\d)\:(?:[0-5]\d)) nếu bạn không và ((?:1[0-2]|0?\d)\:(?:[0-5]\d)) nếu bạn không quan tâm.

+0

Điều đó sẽ bắt buộc 0 hàng đầu phải không? ví dụ. sẽ phù hợp với 05:02 nhưng không phải là 5:02? – Joe

+0

cố định rằng: bạn muốn, bạn không hoặc bạn không quan tâm :) –

16

Đây là ví dụ về sự cố "này tôi biết, tôi sẽ sử dụng cụm từ thông dụng!" là giải pháp sai. Bạn có thể sử dụng cụm từ thông dụng để kiểm tra định dạng đầu vào của bạn là chữ số có chữ số-dấu hai chữ số, sau đó sử dụng logic lập trình để đảm bảo rằng các giá trị nằm trong phạm vi bạn mong đợi. Ví dụ:

/(\d\d?):(\d\d)/ 

if ($1 >= 1 && $1 <= 12 && $2 < 60) { 
    // result is valid 12-hour time 
} 

Điều này dễ đọc và dễ hiểu hơn một số ví dụ về regex mà bạn thấy trong các câu trả lời khác tại đây.

+1

Hoặc nó là một ví dụ mà bạn đang điền vào một cái gì đó yêu cầu biểu thức thông thường ... – Rodger

0

Tôi tin rằng sự thất bại ở trên ít nhất một cách, đặc biệt là về các chuỗi như "13:00" (các trận đấu của Keith "3:00" trong trường hợp đó).

Điều này cần xử lý vấn đề đó cũng như những vấn đề khác được đưa ra.

([01][0-2]|(?<!1)[0-9]):([0-5][0-9]) 
0
(0?\d|1[0-2]):([0-5]\d) 

Điều đó sẽ phù hợp với tất cả mọi thứ từ 00:00 đến 12:59. Đó là 13 giờ, nhân tiện. Nếu bạn không muốn để phù hợp với 0:00-00:59, thử loại này thay vì:

([1-9]|1[0-2]):([0-5]\d) 
0

Bạn có thể sử dụng cái này:

/((?:1[0-2])|(?:0?[0-9])):([0-5][0-9]) ?([ap]m)/ 

/1 => hour 
/2 => minute 
/3 => am/pm 
0

Các trận đấu sau đệm và phi độn giờ một giờ 24 giờ (tức là 00:00 - 23:59) từ 00:00 đến 12:59.

(?:(?<!\d)[0-9]|0[0-9]|1[0-2]):[0-5][0-9] 

Matches:

  • 00:00
  • 00:58
  • 01:34
  • 1:34
  • 8:35
  • 12:23
  • 12:59

Nonmatches:

  • 13:00
  • 13:23
  • 14:45
  • 23:59
1

tại sao regex?bạn có thể làm số nguyên đơn giản sẽ kiểm tra này

$str = "12:74"; 
list($h , $m) = explode(":",$str); 
if (($h <=12 && $h >=0 ) && ($m <=59 && $m >=0)) { 
    print "Time Ok."; 
}else{ 
    print "Time not ok"; 
} 
+0

Vâng, nhưng nếu '$ str' bằng '" foozah "', nó sẽ phá vỡ kịch bản của bạn (vì không có chỉ mục 1). Ngoài ra, nếu '$ str' bằng' "foo: zah" ', tập lệnh của bạn sẽ nói rằng * * là * một thời gian hợp lệ, nhưng tôi thích nghĩ rằng đó không phải là trường hợp. –

6
^(00|0[0-9]|1[012]):[0-5][0-9] ?((a|p)m|(A|P)M)$ 

^ - Trận đầu của chuỗi.

(00|0[0-9]|1[012]) - bất kỳ số nào có hai chữ số lên đến 12. Yêu cầu hai chữ số.

: - Trận dấu hai chấm

[0-5][0-9] - Trận bất kỳ số hai chữ số từ 00 đến 59.

? - Trận một không gian zero hoặc một lần.

((a|p)m|(A|P)M) - Khớp giờ sáng hoặc chiều, không phân biệt chữ hoa chữ thường.

$ - Khớp phần cuối của chuỗi.

0

Đây là mẫu 12 giờ có xác thực AM và PM.

TIME12HOURSAMPM_PATTERN = "^(?:(?<!\\d)[0-9]|0[0-9]|1[0-2]):[0-5][0-9] ?((a|p)m|(A|P)M)$";

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