Có vẻ như bạn đã hiểu sai về cách định nghĩa các lớp ký tự hoạt động trong regex.
Để phù hợp với bất kỳ chuỗi 01
, 02
, 03
, 04
, 05
, 06
, 07
, 08
, 09
, 10
, 11
, hoặc12
, một cái gì đó giống như tác phẩm này:
0[1-9]|1[0-2]
Người giới thiệu
Giải trình
Bản thân một lớp ký tự sẽ cố gắng khớp một và chính xác một ký tự từ chuỗi đầu vào. [01-12]
thực sự xác định [012]
, một lớp nhân vật phù hợp với một nhân vật từ đầu vào đối với bất kỳ của 3 nhân vật 0
, 1
hoặc 2
.
Các -
định nghĩa phạm vi đi từ 1
đến 1
, mà chỉ bao gồm 1
. Mặt khác, một cái gì đó giống như [1-9]
bao gồm 1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
.
Những người mới bắt đầu thường mắc sai lầm khi xác định những thứ như [this|that]
. Điều này không "hoạt động". Nhân vật này định nghĩa định nghĩa [this|a]
, tức là nó phù hợp với một nhân vật từ đầu vào đối với bất kỳ của 6 ký tự t
, h
, i
, s
, |
hoặc a
. Nhiều khả năng (this|that)
là những gì được dự định.
Người giới thiệu
Cách xác định phạm vi
Vì vậy, hiển nhiên bây giờ một mẫu như between [24-48] hours
không "hoạt động". Lớp ký tự trong trường hợp này tương đương với [248]
.
Nghĩa là, -
trong định nghĩa lớp ký tự không xác định phạm vi số trong mẫu. Các công cụ Regex không thực sự "hiểu" các số trong mẫu, ngoại trừ cú pháp lặp lại hữu hạn (ví dụ: a{3,5}
khớp giữa 3 và 5 a
).
Định nghĩa phạm vi thay vào đó sử dụng mã hóa ASCII / Unicode của các ký tự để xác định phạm vi. Ký tự 0
được mã hóa trong ASCII dưới dạng số thập phân 48; 9
là 57. Do đó, định nghĩa ký tự [0-9]
bao gồm tất cả các ký tự có giá trị từ số thập phân 48 đến 57 trong bảng mã. Thay vào đó một cách hợp lý, theo thiết kế đó là những ký tự 0
, 1
, ..., 9
.
Xem thêm
Một ví dụ khác: A đến Z
Chúng ta hãy xem xét một định nghĩa lớp ký tự phổ biến khác [a-zA-Z]
Trong ASCII:
A
= 65, Z
= 90
a
= 97, z
= 122
Điều này có nghĩa rằng:
[a-zA-Z]
và [A-Za-z]
tương đương
- Trong hầu hết các hương vị,
[a-Z]
có thể là một phạm vi ký tự bất hợp pháp
- bởi vì
a
(97) là "lớn hơn" hơn Z
(90)
[A-z]
là hợp pháp, nhưng cũng bao gồm sáu ký tự sau:
[
(91), \
(92), ]
(93), ^
(94), _
(95), `
(96)
Câu hỏi liên quan
[a-z0-9]
này khớp với tất cả các chữ cái thường và tất cả các chữ số, nhưng chỉ với một ký tự duy nhất.