Regex cộng với sự khác biệt sao?


90

Sự khác biệt giữa:

(.+?)

(.*?)

khi tôi sử dụng nó trong php preg_matchregex của tôi ?

Câu trả lời:


150

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.*?bsẽ 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


2
"lười biếng" là một thuật ngữ phổ biến hơn cho "ungreedy"
Walter Tross

Ví dụ không chính xác. Cả hai (.+?)(.*?)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.
Louis55

Tại sao a. * B không trả lại "ab"? Không phải là nói "từ có giữa a và b, 0 hoặc nhiều ký tự", do đó, ab không có ký tự nào giữa và có thể là một kết hợp. Tại sao điều này không chính xác?
Hello World

@HelloWorld, điều này liên quan đến tính tham lam mà tôi đã giải thích ở trên. .*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 .*?
vô duyên

22

Dấu ( +) đầu tiên là một hoặc nhiều ký tự . Dấu ( *) thứ hai là không hoặc nhiều ký tự . Cả hai đều không tham lam ( ?) và phù hợp với bất kỳ thứ gì ( .).


1
Điều đó phụ thuộc vào việc sửa đổi s có được đặt hay không.
Quentin

8

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ó.


8

+ 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ể.


8

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ề abamẫu(ab.+)

aba

Tôi nghĩ rằng đây là câu trả lời tốt hơn đặc biệt cho câu hỏi của + vs *
Terrence

6

+là giá trị nhỏ nhất, *cũng có thể bằng 0.


"+ is minimal one"Câu văn này có nghĩa là gì?
Det

5

Trong RegEx, {i,f}có nghĩa là "giữa iđể fcá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


4

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.


2

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: 15only. 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 đó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.