Sự khác biệt giữa:
(.+?)
và
(.*?)
khi tôi sử dụng nó trong php preg_match
regex của tôi ?
Sự khác biệt giữa:
(.+?)
và
(.*?)
khi tôi sử dụng nó trong php preg_match
regex của tôi ?
Câu trả lời:
Chúng được gọi là bộ định lượng.
*
0 hoặc nhiều hơn của biểu thức trước
+
1 hoặc nhiều biểu thức trước
Theo mặc định, một bộ định lượng là tham lam, có nghĩa là nó khớp với càng nhiều ký tự càng tốt.
Sau ?
khi bộ định lượng thay đổi hành vi để làm cho bộ định lượng này "vô duyên", có nghĩa là nó sẽ khớp với số lượng ít nhất có thể.
Ví dụ tham lam / vô duyên
Ví dụ trên chuỗi " abab "
a.*b
sẽ khớp với "abab" (preg_match_all sẽ trả về một kết quả phù hợp, "abab")
trong khi a.*?b
sẽ chỉ khớp với "ab" bắt đầu (preg_match_all sẽ trả về hai kết quả phù hợp, "ab")
Bạn có thể kiểm tra regexes của mình trực tuyến, ví dụ trên Regexr, xem ví dụ tham lam ở đây
(.+?)
và (.*?)
hành xử khác nhau ở một vị trí khác nhau của biểu thức thông thường mà là a(.+?)
, (.+?)b
, a(.+?)b
, a(.*?)
, (.*?)b
, a(.*?)b
.
.*
sẽ phù hợp nhất có thể. Nếu bạn muốn dừng lại càng sớm càng tốt, thì bạn phải làm cho nó trở nên .*?
A +
khớp với một hoặc nhiều trường hợp của mẫu trước đó. A *
khớp với không hoặc nhiều trường hợp của mẫu trước.
Vì vậy, về cơ bản, nếu bạn sử dụng +
thì phải có ít nhất một phiên bản của mẫu, nếu bạn sử dụng *
nó sẽ vẫn khớp nếu không có phiên bản nào của nó.
+
khớp với ít nhất một ký tự
*
khớp với bất kỳ số nào (kể cả 0) ký tự
Biểu thức ?
chỉ ra một biểu thức lười biếng, vì vậy nó sẽ khớp với ít ký tự nhất có thể.
Hãy xem xét bên dưới là chuỗi để phù hợp.
ab
Mẫu (ab.*)
sẽ trả về kết quả khớp cho nhóm chụp với kết quả làab
Trong khi mẫu (ab.+)
sẽ không khớp và không trả về bất cứ thứ gì.
Nhưng nếu bạn thay đổi chuỗi thành sau, nó sẽ trả về aba
mẫu(ab.+)
aba
Trong RegEx, {i,f}
có nghĩa là "giữa i
để f
các trận đấu". Hãy xem các ví dụ sau:
{3,7}
có nghĩa là từ 3 đến 7 trận đấu {,10}
có nghĩa là tối đa 10 trận đấu không có giới hạn thấp hơn (tức là giới hạn thấp là 0){3,}
có nghĩa là ít nhất 3 trận đấu không có giới hạn trên (tức là giới hạn cao là vô cùng){,}
có nghĩa là không có giới hạn trên hoặc giới hạn dưới cho số lượng trận đấu (nghĩa là giới hạn dưới là 0 và giới hạn trên là vô cùng){5}
nghĩa là chính xác 4 Hầu hết các ngôn ngữ tốt đều chứa các từ viết tắt, RegEx cũng vậy:
+
là cách viết tắt của {1,}
*
là cách viết tắt của {,}
?
là cách viết tắt của {,1}
Điều này có nghĩa là +
yêu cầu ít nhất 1 trận đấu trong khi *
chấp nhận bất kỳ số trận đấu nào hoặc không có trận đấu nào cả và ?
chấp nhận không quá 1 trận đấu hoặc 0 trận đấu.
Tín dụng: Codecademy.com
Dấu sao rất giống với dấu cộng, điểm khác biệt duy nhất là trong khi dấu cộng khớp với 1 hoặc nhiều ký tự / nhóm đứng trước, dấu sao khớp với 0 hoặc nhiều hơn.
Tôi nghĩ các câu trả lời trước không nêu được một ví dụ đơn giản:
ví dụ chúng ta có một mảng:
numbers = [5, 15]
Biểu thức regex sau ^[0-9]+
phù hợp với: 15
only. Tuy nhiên, ^[0-9]*
phù hợp với cả hai 5 and 15
. Sự khác biệt là +
toán tử yêu cầu ít nhất một bản sao của biểu thức regex trước đó