2010-06-13 15 views
41

Tôi đã nhìn thấy mẫu regex mà sử dụng lặp đi lặp lại đánh số rõ ràng thay vì ?, *+, ví dụ:Sử dụng đánh số một cách rõ ràng sự lặp lại thay vì dấu chấm hỏi, sao và cộng

Explicit   Shorthand 
(something){0,1} (something)? 
(something){1}  (something) 
(something){0,}  (something)* 
(something){1,}  (something)+ 

Các câu hỏi là:

  • Hai biểu mẫu này có giống nhau không? Điều gì sẽ xảy ra nếu bạn thêm các công cụ sửa đổi sở hữu/miễn cưỡng?
  • Nếu chúng giống hệt nhau, cái nào là thành ngữ hơn? Dễ đọc hơn? Đơn giản là "tốt hơn"?

Trả lời

55

Kiến thức của tôi giống hệt nhau. Tôi nghĩ rằng có lẽ một vài động cơ ra khỏi đó mà không hỗ trợ cú pháp đánh số nhưng tôi không chắc chắn đó. Tôi mơ hồ nhớ lại một câu hỏi trên SO một vài ngày trước, nơi ký pháp rõ ràng sẽ không hoạt động trong Notepad ++.

Thời gian duy nhất tôi sẽ sử dụng sự lặp lại đánh số một cách rõ ràng là khi sự lặp lại lớn hơn 1:

  • Đúng hai: {2}
  • Hai hay nhiều: {2,}
  • Hai đến bốn: {2,4}

Tôi có xu hướng thích những điều này đặc biệt khi mẫu lặp lại nhiều hơn một vài ký tự. Nếu bạn phải phù hợp với 3 số, một số người thích viết: \d\d\d nhưng tôi thà viết \d{3} vì nó nhấn mạnh số lần lặp lại có liên quan. Hơn nữa, xuống đường nếu con số đó cần thay đổi, tôi chỉ cần thay đổi {3} thành {n} và không phân tích lại regex trong đầu hoặc lo lắng về việc làm rối loạn nó; nó đòi hỏi ít nỗ lực tinh thần hơn.

Nếu tiêu chí đó không được đáp ứng, tôi thích viết tắt. Sử dụng ký hiệu "rõ ràng" nhanh chóng làm xáo trộn mẫu và khiến bạn khó đọc. Tôi đã làm việc trên một dự án mà một số nhà phát triển không biết regex quá tốt (nó không chính xác chủ đề yêu thích của mọi người) và tôi thấy rất nhiều {1}{0,1} lần xuất hiện. Một vài người sẽ yêu cầu tôi viết mã xem xét mẫu của họ và đó là khi tôi đề nghị thay đổi những sự kiện này thành ký hiệu viết tắt và tiết kiệm không gian và, IMO, cải thiện khả năng đọc.

+0

+1, tôi cũng nghĩ rằng viết tắt là tốt hơn, nhưng tôi cũng yêu thích những ternaries lồng nhau, và tôi đã gần như hét lên vì làm điều đó. Tôi có thể thấy rằng một số người có thể nghĩ rằng '{0,1}' "cho thấy ý định rõ ràng hơn" hơn '?', Do đó là Q. – polygenelubricants

2
  • Chúng giống hệt nhau trừ khi bạn đang sử dụng một công cụ regex ngoại lệ. Tuy nhiên, không phải tất cả các công cụ regex đều hỗ trợ lặp lại số, ? hoặc +.

  • Nếu tất cả đều có sẵn, tôi sẽ sử dụng ký tự thay vì số, đơn giản vì nó trực quan hơn đối với tôi.

1

Họ tương đương (và bạn sẽ tìm hiểu xem họ đang có sẵn bằng cách kiểm tra ngữ cảnh của bạn.)

Vấn đề tôi muốn dự đoán là khi bạn có thể không phải là người duy nhất bao giờ cần để làm việc với mã của bạn. Regexes là đủ khó khăn cho hầu hết mọi người. Bất cứ lúc nào ai đó sử dụng một cú pháp khác thường, câu hỏi phát sinh: "Tại sao họ không làm theo cách tiêu chuẩn? Họ nghĩ gì về việc tôi bị thiếu?"

7

tôi có thể xem như thế nào, nếu bạn có một regex mà không nhiều sự lặp lại bị chặn, bạn có thể muốn sử dụng mẫu {n,m} liên tục vì khả năng đọc của Ví dụ:.

/^ 
abc{2,5} 
xyz{0,1} 
foo{3,12} 
bar{1,} 
$/x 

Nhưng tôi có thể' Khi tôi thấy {0,1}, hoặc {1,} được sử dụng trong một câu hỏi, nó hầu như luôn luôn được thực hiện trong sự thiếu hiểu biết. Và trong quá trình trả lời một câu hỏi như vậy, chúng ta cũng nên gợi ý rằng sử dụng số ?, * hoặc + thay thế.

Và dĩ nhiên, {1} là sự lộn xộn thuần túy. Một số người dường như có một khái niệm mơ hồ rằng nó có nghĩa là "một và chỉ một" - sau khi tất cả, nó phải có nghĩa là một cái gì đó, phải không? Tại sao một ngôn ngữ kỳ quái như vậy sẽ hỗ trợ một cấu trúc chiếm toàn bộ ba ký tự và không làm gì cả? Cách sử dụng hợp pháp duy nhất mà tôi biết là cô lập một backreference được theo sau bởi một chữ số (ví dụ: \1{1}0), nhưng có nhiều cách khác để làm điều đó.

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