Tại sao các biểu hiện thường xuyên rất hấp dẫn?


23

Phụ lục 1 , Phụ lục 2 , tôi đoán bạn sẽ không khó để nhớ lại các ví dụ khác.

Điều quan trọng là: nếu có nhiều hơn một cách để giải quyết vấn đề, lập trình viên PHP (tôi thường duyệt thẻ PHP trên StackOverflow) sẽ yêu cầu trợ giúp về giải pháp liên quan đến các biểu thức thông thường.

Ngay cả khi nó sẽ ít kinh tế hơn, ngay cả khi hướng dẫn sử dụng php đề xuất ( liên kết ) sử dụng str_replacethay vì bất kỳ preg_*hoặc ereg_*chức năng nào khi không yêu cầu quy tắc thay thế ưa thích.

Có ai đó có manh mối về lý do tại sao điều này xảy ra?

Đừng hiểu lầm tôi, một số người bạn thân nhất của tôi là những biểu hiện thường xuyên và tôi không khinh thường Perl. Điều tôi không nhận được là tại sao không tìm kiếm lựa chọn thay thế nào, ngay cả khi mức độ quá mức rõ ràng (regex để chuyển chuỗi) hoặc độ phức tạp của mã tăng theo cấp số nhân (regex để lấy dữ liệu từ html trong PHP )


2
Bạn có thể muốn trích dẫn những gì hướng dẫn sử dụng php thực sự nói.
ChrisF

1
Bởi vì chúng khó hiểu, vì vậy bạn muốn trở thành một phần của câu lạc bộ kewl kidz 'độc quyền? Và chủ yếu là vì họ cung cấp một cách ngắn gọn để thể hiện một trận đấu hoặc trích xuất, đó là những gì họ được tạo ra. Chắc chắn cho các trường hợp giả, phân tích cú pháp tùy chỉnh nếu tốt hơn, nhưng thời gian dành cho việc viết một regex nhanh là có lợi cho regex.
haylem

Bạn nhấn mạnh phần sai của câu cuối cùng: Phần thái quá của nó là "từ html", không phải "trong PHP".
Izkata

Câu trả lời:


20

Tại sao các biểu hiện thường xuyên rất hấp dẫn?

Bởi vì ở cấp độ tiềm thức, họ cảm thấy giống như một chương trình thông minh, người có thể tự mình hoàn thành rất nhiều việc trong khi bao quát và tự điều chỉnh (suy nghĩ theo mô hình).

Đây là lý do tại sao mọi người ngay lập tức tin rằng các biểu thức chính quy sẽ giải quyết bất kỳ tác vụ dựa trên văn bản nào của họ, bằng cách nào đó không nghĩ rằng nó có thể là quá mức cần thiết và không nhận ra nó có thể làm tôi thất vọng (phân tích ngôn ngữ với nó).

Một vật nhỏ chứa sức mạnh ma thuật. Bạn không thể nói không, phải không?


5
+1 - Một điều khó hiểu nhỏ , không hơn không kém.
AJ Johnson

Hobitses là tricksty
Ben DeMott

49

Khi công cụ duy nhất bạn có là regex, mọi vấn đề sẽ giống như ^((?>[a-zA-Z\d!#$%&'*+\-/=?^_{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$


16
Sự cám dỗ để chọn câu trả lời này rất mạnh mẽ, nhưng tôi đoán tôi phải chống lại vì đây là câu hỏi đầu tiên của tôi mở ra ở đây và tôi phải giả vờ nghiêm túc trong một thời gian.
cbrandolino

1
@Dev, nó có nhiều ý nghĩa. Nhận xét của tôi chỉ là một cách được cho là buồn cười để bày tỏ sự đánh giá cao của tôi cho câu trả lời.
cbrandolino

17
Điều gì trên trái đất này phù hợp?
Tom O'Connor

4
Tôi không biết ... Tôi nghĩ rằng điều này khá nhiều tổng hợp của nó. Nếu bạn biết regex và không biết về các phương pháp khác, tại sao bạn lại đi tìm? Bạn đã có một công cụ, nếu được thực hiện đúng, sẽ xử lý công việc. Cho đến khi họ vấp ngã phương pháp đơn giản hơn hoặc được nói về nó, regex sẽ là phương thức bắt tất cả, ngay cả khi phức tạp hơn mức cần thiết.
Aeo

4
@Tom O'Connor Tôi nghĩ rằng đó là một cái gì đó gần với Regex để khớp địa chỉ email RFC 2822, nhưng tôi đã phải loại bỏ một vài ký tự vì chúng đang tàn phá với việc đánh dấu.
glenatron

23

Tôi nghĩ đó là vì:

  1. Chúng ngắn gọn tuyệt vời (khi được sử dụng đúng cách) so với mã tương đương và
  2. Chúng được hỗ trợ rộng rãi trên các ngôn ngữ lập trình, vì vậy hầu hết các nhà phát triển đều quen thuộc với chúng.

3
# 2 có ý nghĩa.
cbrandolino

23

Trong các giai đoạn đầu của sự nghiệp (ví dụ: tiền PHP), tôi là một bậc thầy về Perl và một khía cạnh chính của Perl gurudom là thông thạo các biểu thức chính quy.

Trong nhóm hiện tại của tôi, tôi thực sự là người duy nhất trong chúng ta đạt được regex trước các công cụ khác (thường là khó chịu hơn). Có vẻ như phần còn lại của đội là ma thuật thuần túy. Họ sẽ lăn qua bàn của tôi và yêu cầu một regex khiến tôi mất đúng mười giây để đặt lại với nhau, và sau đó bị thổi bay khi nó hoạt động. Tôi không biết - tôi đã làm việc với họ rất lâu, vào thời điểm này thật tự nhiên.

Trong trường hợp không có sự lưu loát regex, bạn sẽ có các kết hợp của các câu lệnh kiểm soát dòng chảy bao gồm các câu lệnh strstr và strpose, điều này trở nên xấu xí và khó chạy trong đầu bạn. Tôi muốn tạo ra một regex tao nhã hơn ba mươi dòng tìm kiếm chuỗi.


2
Tôi không thể nâng cao điều này đủ.
CaffGeek

8
Tôi tò mò: bạn có đọc trôi chảy như bạn viết chúng không?
peterchen

7
Tôi hy vọng bạn đang tổ chức các buổi đào tạo regex thường xuyên và / hoặc ghi lại tài liệu ra khỏi mã của bạn; nếu không, bạn đang tạo ra một cơn ác mộng hỗ trợ cho đồng nghiệp của bạn. Thời gian bạn tiết kiệm được bằng cách viết regex đó có thể bị mất hàng trăm lần bởi những người đang cố gắng hiểu ý nghĩa của "regex thanh lịch" đang làm.
Jeff Knecht

3
Thật tuyệt vời Bạn có thể nghe thấy sự giằng xé giữa những cuộc hôn nhân đáng yêu và đáng ghét ngay tại đây trong những bình luận này.
Dan Ray

1
@Ben Lee: Tôi đoán vậy - OTOH, tôi chưa bao giờ gặp phải một regex bình luận nào trong tự nhiên. Một số vấn đề với regexes có thể dựa trên thái độ lạnh lùng.
peterchen

16

Trái lại. Mọi người đang nói về regex là cách meme ác quá thường xuyên IMO. Rõ ràng là preg_match bị lạm dụng quá mức php, nhưng ít rõ ràng hơn là thông thường có thể làm được điều đó (trong PHP).

Tôi sẽ đi xa và phỏng đoán rằng đó là một vi mô hóa khác trong vùng đất php để sử dụng các hàm chuỗi. Có rất nhiều và nhiều hữu ích, và chúng thường là sự lựa chọn tốt hơn. Nhưng bạn không nên trốn tránh preg_matchủng hộ nhiều strposifchuỗi. Bởi vì trong thực tế hóa ra, libpcre thường nhanh hơn PHP có thể thực thi một vòng lặp tìm kiếm các lựa chọn thay thế chuỗi, ví dụ

Như một ví dụ gần đây khiến tôi nhận ra, kiểm tra xem một chuỗi có phải là chữ thường không:

 if ($string == strtolower($string))

Dễ đọc hơn:

 if (!preg_match("/[A-Z]/", $string))

Và bạn sẽ cho rằng cái đầu tiên phải nhanh hơn, vì nó toàn là PHP. Nhưng trong thực tế, regex chỉ nhìn qua chuỗi một lần và có thể hủy bỏ điều kiện phủ định ngay khi nó tìm thấy một chữ cái viết hoa. Tuy nhiên, cách tiếp cận strtolower () nhìn qua chuỗi hai lần. Strtolower đầu tiên () tạo ra một chuỗi trùng lặp bằng cách lặp qua từng chữ cái, so sánh và vượt qua nó. Sau đó ==lặp lại so với bản gốc và bản sao một lần nữa, so sánh chúng một lần nữa.

Vì vậy, đó không phải là một trường hợp rõ ràng. Và để khách quan, cái đầu tiên thường nhanh hơn, vì bạn thường chỉ so sánh các chuỗi ngắn. Nhưng bắt buộc không nên mù quáng bởi giả định rằng các hàm chuỗi PHP luôn được khuyến khích so với các biểu thức thông thường.

(Tôi muốn thêm một câu nói khác về câu trả lời thú vị của @ bobince về xhtml-regexes và cách gần đây nó thường được liên kết theo cách rất không có ích. Và những câu trả lời khách quan hơn dưới đây bị bỏ qua.)


1
Tôi đồng ý với ví dụ của bạn; Tuy nhiên, trong trường hợp cụ thể này, tôi vẫn thích Ếstrtolower () dù sao: trong mã không quan trọng, thậm chí tối ưu hóa thời gian thực hiện lớn (tương đối với việc thực hiện khác) là không đáng kể - trừ khi bạn muốn đánh giá trường hợp thấp hơn- Không có một tệp văn bản lớn, nhưng tôi không thể tưởng tượng được một trường hợp nào hữu ích.
cbrandolino

1
@cbrandolino: Không có thảo luận ở đó. Công cụ này chỉ nên có liên quan và được đánh giá cho các vòng lặp lồng nhau, nơi nó có thể tạo ra sự khác biệt thực tế.
mario

4
+1 Đối với thực tế mọi người luôn bash họ, nhiều hơn họ được hỗ trợ.
Orble

1
Là một trong những "bashers regrec": Thật vui khi thấy một lớp lót ít nhiều thể hiện chuỗi "thủ công" phân tích cú pháp nedds 30 dòng để làm gì. Tuy nhiên, bảo trì chịu đựng trong hầu hết các ví dụ thực tế. Ngoài ra, khi cố gắng áp dụng chúng cho đầu vào không có giá trị, việc tạo ra chẩn đoán phù hợp cho đầu vào bị từ chối yêu cầu nhào lộn bổ sung. Đối với tôi, đó là mã "chỉ viết" nguyên mẫu - tuyệt vời cho các tập lệnh nhanh, hút các ứng dụng sống lâu.
peterchen

1
Bất cứ ai không viết tất cả các biểu thức của mình trong /xchế độ để cho phép khoảng trắng cho khuỷu tay của nhận thức, và để nhận xét để giải thích lý do tại sao mọi việc đang được thực hiện, tất nhiên nên để tai của anh ấy. Nhưng đối với các biểu thức thực tế có độ phức tạp hợp lý, bạn cần xem xét áp dụng thiết kế từ trên xuống thông qua các biểu thức ngữ pháp . Một khi bạn đã nhìn thấy ánh sáng, bạn sẽ không bao giờ quay trở lại /@#$^^@#$^&&*)@#/.
tchrist

8

Các biểu thức thông thường rất hấp dẫn bởi vì chúng là công cụ tốt nhất để phân tích một ngôn ngữ thông thường.

Chúng có những ưu điểm sau:

  • Chúng ngắn gọn . Thông thường cần nhiều mã hơn để phân tích một ngôn ngữ thông thường cụ thể bằng cách sử dụng một thuật toán cụ thể mà bạn đã đưa ra so với một biểu thức chính quy.
  • Họ nhanh chóng sử dụng. Thông thường sẽ mất nhiều thời gian hơn để viết một trình phân tích cú pháp cho một ngôn ngữ thông thường cụ thể bằng cách sử dụng một thuật toán cụ thể mà bạn đã đưa ra so với một biểu thức chính quy.
  • Họ rất dễ dàng . Một khi bạn tìm hiểu tập hợp các ký tự đặc biệt và ý nghĩa của chúng, thật dễ dàng để soạn một biểu thức chính quy (mặc dù khó đọc hơn một chút). Regexps là ngôn ngữ - một đặc điểm hữu ích vì loài của chúng ta đã phát triển rất giỏi ngôn ngữ.
  • Họ rất nhanh . Sau khi được biên dịch, chúng có thể khớp với độ dài chuỗi Ntrong Nthời gian O ( ).
  • Họ rất linh hoạt . Chúng có thể phù hợp với bất kỳ ngôn ngữ thông thường nào và rất nhiều dữ liệu của chúng tôi được thể hiện dưới dạng ngôn ngữ thông thường.
  • Họ có mặt khắp nơi . Hầu hết các ngôn ngữ lập trình đều có hỗ trợ regex cơ bản - thông qua các thư viện bên ngoài hoặc được nhúng vào chính ngôn ngữ đó. Cũng không có quá nhiều biến thể giữa các ngôn ngữ regrec.

Điều này làm cho chúng hấp dẫn cho các tình huống mà chúng phù hợp, nhưng mọi người có thể sử dụng chúng trong bối cảnh mà chúng không phải là công cụ tốt nhất, bởi vì chúng:

  • Không hiểu rằng những gì chúng phù hợp không thể được thể hiện bằng cách sử dụng biểu thức chính quy (ví dụ: HTML).
  • Lười biếng (theo cách xấu) - họ biết một công cụ và nhận ra rằng đó không phải là công cụ tốt nhất cho những gì họ đang làm nhưng nó sẽ hoạt động mà không gặp vấn đề gì 95% thời gian và mất 95% nỗ lực học cụ thể phân tích cú pháp hoặc viết một từ đầu.
  • Họ không biết rằng các công cụ tốt hơn tồn tại.

Er, tôi đã đề cập đến một số trường hợp cụ thể trong đó rõ ràng chúng không phải là cách tốt nhất để tiến hành nhưng vẫn được sử dụng. Tôi thích regex (ý tôi là, tôi thấy chúng nhàm chán và vô hồn nhưng vẫn rất hữu ích trong một số bối cảnh), và biết lợi thế của chúng là gì.
cbrandolino

Tôi đồng ý với phần còn lại, nhưng nhanh chóng & dễ dàng? Đường cong học tập rất dốc: đối với người mới bắt đầu, thật khó để hiểu tại sao một biểu thức không hoạt động và mọi triển khai regrec dường như có ít nhất những khác biệt tinh tế, vì vậy oyu phải xem bạn cố gắng học từ đâu.
peterchen

Tại sao mọi người lại nhầm lẫn khi rút ra một chút HTML với việc phân tích hoàn toàn một trang web đầy đủ thành một cây phân tích đầy đủ? Nó thực sự ngu ngốc. Hãy tin tôi, khi tôi chỉnh sửa các trang HTML vi, bạn đặt cược cuộc sống của bạn tôi sử dụng :%s/foo/bar/gcnó. Nếu nó đủ tốt cho một biên tập viên, thì nó đủ tốt cho một kịch bản.
tchrist

6

Hmmm, tôi chỉ có thể đoán. Có thể một số người đã trải nghiệm rằng 30 dòng mã của họ đã được thay thế bằng regex dài 20 ký tự, vì vậy họ cảm thấy sai khi sử dụng bất cứ thứ gì khác thay vào đó khi regex có thể được sử dụng.


4

Nó phù hợp với cách một số người nghĩ. Tôi không thích họ, nhưng tôi có những người bạn dường như nghĩ về regexps. Tôi đoán rằng mô hình phù hợp với một phần của bộ não của họ được tiếp xúc nhiều hơn so với logic chính thức. :-)


6
Về mặt lịch sử tiến hóa của chúng tôi là lý do. Chúng tôi đã khớp các mẫu từ lâu trước khi chúng tôi xác định ngữ pháp hoặc khám phá các tam đoạn luận.
glenatron

1
Tôi không đồng ý, lập trình liên quan đến logic và khớp mẫu, hai lĩnh vực. Regexps rất tốt trong việc khớp mẫu và nên được sử dụng cho các tác vụ đó. Nói quá "Tôi không thích họ", là vứt bỏ một công cụ tốt cho một công việc cụ thể.
Orble

@ Tổ chức: Câu hỏi không phải là họ tốt hay xấu, mà tại sao một số người lạm dụng chúng và những người khác thì không.
Lennart Regebro

Câu hỏi có thể là, nhưng câu trả lời của bạn cho thấy một hoặc loại tâm trí khác đang chơi, hơn là cả hai.
Orble

Tôi không nghĩ "đề nghị" là từ chính xác.
Lennart Regebro

3

Tôi nghĩ rằng sự phổ biến của regex là do tính phổ biến của chuỗi. Chuỗi là cấu trúc dữ liệu đơn giản nhất, là cấu trúc đầu tiên mà hầu hết chúng ta học. Vì tất cả các mã của chúng tôi được viết ở dạng biểu tượng, nên việc lập trình viên xem xét mô hình hóa một cái gì đó ở dạng biểu tượng là điều tự nhiên. Nhưng nếu ngôn ngữ lập trình của chúng tôi cung cấp bất kỳ sự kháng cự nào khi chúng tôi cố gắng mở rộng cú pháp của nó cho các hình thức biểu tượng mới thông minh của chúng tôi, tất cả chúng đều kết thúc giữa các trích dẫn. Mô hình dữ liệu quan hệ có SQL. Mô hình dữ liệu XML có XQuery. Nhưng những gì về mô hình dữ liệu chuỗi khiêm tốn? Regex!

Mới hôm qua, tôi đã xem qua API cho một khung Javascript mới sáng bóng hỗ trợ phát triển trò chơi HTML5. Nó có một cơ chế khai báo để mô tả các hệ thống con chính mà trò chơi của bạn sẽ cần. Làm thế nào để chỉ định các tính năng đó? JSON? Thông thạo dấu chấm? Một mảng? Không - một chuỗi chứa danh sách các tên tính năng được phân tách bằng dấu phẩy và khoảng trắng. Tôi tự hỏi làm thế nào nó phân tích danh sách đó ...?


2

Bởi vì bạn có thể nhìn thấy toàn bộ mọi thứ cùng một lúc. Bằng cách có thể nhìn thấy toàn bộ, nó có thể làm việc dễ dàng hơn và điều đó luôn tốt đẹp. Nó giống như lý do mà nhiều lập trình viên C ++ vẫn sử dụng các câu lệnh kiểu printf: Nó không an toàn (mặc dù gcc ít nhất có thể kiểm tra các loại trên các câu lệnh printf), và nó không đẹp, nhưng cậu bé nhỏ gọn và có thể sử dụng được.

Nếu đó là một regex đủ đơn giản, thì chúng thường là cách tốt nhất để làm mọi thứ - hình thức nhỏ gọn và nhiều khả năng của chúng khiến chúng trở nên hoàn hảo cho một số nhiệm vụ nhất định. Vấn đề xảy ra khi bạn làm cho regex trở nên phức tạp đến mức bạn không thể đọc nó nữa hoặc khi bạn đang sử dụng một regex phức tạp để làm một việc gì đó có thể được thực hiện nhanh hơn thông qua các thao tác chuỗi đơn giản.

Regex, giống như bất kỳ công cụ mạnh mẽ nào khác, phải được sử dụng ở mức độ vừa phải - không quá nhiều, không quá ít. Và trừ khi hiệu suất là một mối quan tâm lớn, đôi khi một regex có thể viết nhanh hơn và dễ gỡ lỗi hơn một loạt các hoạt động chuỗi.


2

Hmm, câu trả lời hiện tại tập trung quá nhiều vào các khía cạnh kỹ thuật và ưu / nhược điểm dễ đọc ( một điểm quan trọng). Vì vậy, hãy để tôi thử chuyển nó thêm một chút vào môi trường / cộng đồng PHP:

  • PHP là Perls ít chị gái . Và một phần không thể thiếu của Perl là các biểu thức chính quy (họ đã phát minh ra thứ đó, phải không?). Do đó, đó là một trong những lý do tại sao regexps cũng phổ biến trong PHP.
  • Các trường hợp sử dụng của PHP là tình cờ không có nhiều không giống như các trường hợp sử dụng cho các biểu thức thông thường. PHP được cấu trúc sử dụng để dán các trang HTML lại với nhau. Và regexps hoạt động trên văn bản. (những gì WReach nói)
  • Tối ưu hóa vi mô . Như đã đề cập trước đây: mọi người sử dụng các hàm regexps và / hoặc chuỗi PHP thường xuyên sau khi nhận thấy tốc độ. Một vấn đề cốt lõi trong vòng tròn PHP, không cụ thể đối với biểu thức chính quy.
  • Biểu thức chính quy được tích hợp sẵn . Trong Python, trong Java, trong C #, trong Ruby? có sẵn, nhưng ngăn cản việc phải tải thêm một mô-đun. Và xem làm thế nào trong PHP hoặc Javascript, nơi nó là một tính năng cốt lõi, mô hình sử dụng khác nhau. Một triển lãm khác: CSS nơi nó được sử dụng thường xuyên hơn.
  • Các hướng dẫn PHP là có lỗi. Nó thường là như vậy. Các biểu thức thông thường có thể dễ dàng khám phá và tôi đã hoãn sự thật thú vị này bởi vì nó rõ ràng nhàm chán: tất cả các hướng dẫn chết tiệt và sách giới thiệu PHP luôn dạy về các biểu thức thông thường, nhưng không giáo dục về các trường hợp sử dụng.
  • Các chuỗi API trong PHP được thiết kế bởi những người giống như mang đến cho bạn báo giá ảo thuật và không gian tên \ tách. Nó bao gồm, tốt hơn Java, nhưng không hoàn toàn quyến rũ. Đặc biệt, nếu các chuỗi có thể tăng gấp đôi như các đối tượng (xem Python), các hàm chuỗi có thể vượt quá biểu thức chính quy.

Nhưng đó chỉ là ghi chú bên. Tôi tin rằng dù sao đi nữa, chủ yếu là các lý do kỹ thuật và lâu năm dẫn đến việc sử dụng quá mức và / hoặc lẩn tránh các biểu thức chính quy nói chung. Tuy nhiên, PHP và cơ sở người dùng của nó có một vài thuộc tính kết hợp nó và tại sao chúng ta thấy nhiều câu hỏi hơn về SO về nó [cần dẫn nguồn!] Và chúng "hấp dẫn một cách bệnh hoạn" ở đó.


1

Tôi thích các biểu thức thông thường nói chung tôi thấy chúng dễ đọc / dễ hiểu hơn 20 dòng mã tôi sẽ phải thay thế chúng bằng. Các biểu thức chính quy ngắn được đọc và hiểu nhanh chóng và chúng tương đối dễ bảo trì (nếu biểu thức thay đổi, bạn chỉ có một dòng để thay đổi so với việc xem qua 20 dòng mã để thực hiện thay đổi). Có những lúc họ bị lạm dụng nhưng nhiều thứ khác cũng vậy.

Lý do bạn có thể thấy lạm dụng chúng rất nhiều là vì bạn duyệt phần PHP của StackOverFlow vì tôi chắc chắn rằng bạn biết rằng có rất nhiều lập trình viên PHP chưa trưởng thành ngoài kia.


1

Tại sao các biểu hiện thường xuyên rất hấp dẫn?

Họ không phải. Họ thực sự xấu xí như địa ngục. Và không thể hiểu được. Chúng là một thứ gớm ghiếc nên bị giết càng sớm càng tốt.

Bây giờ, điều này đang được nói, tôi sẽ quay lại để gỡ lỗi một ứng dụng Perl nhỏ. Không thể giúp nó; không may mắn, đôi khi chúng vẫn là công cụ tốt nhất cho công việc.


4
Tôi thích nói rằng các biểu thức thông thường không phải là "thông thường" hay "biểu cảm"
Andrew Barber

2
Chúng xấu và không thể hiểu được nếu bạn không hiểu chúng. Khi bạn đạt được đỉnh cao của regex, chúng thực sự khá thanh lịch.
Dan Ray

1
-1 Để quyết định rằng tất cả các lập trình viên thích được tối nghĩa, và sau đó không xem xét bất kỳ lời giải thích có thể khác. ... Nói rõ lý do tại sao bạn nghĩ rằng họ xấu xí hoặc không thể hiểu được sẽ có ích.
Macneil

1
@Macneil - Xin vui lòng, (mặc dù có, mặc dù tôi vẫn ở đó), trừ khi bạn trích dẫn tôi không nói rằng tôi đã nói / quyết định về điều gì đó tôi đã không làm (phần đầu tiên trong nhận xét của bạn). Theo như câu hỏi của bạn, bạn thấy chúng thật đẹp?! ... Tôi không. Và vì đây là một trang chủ quan, và đó là một ý kiến ​​chủ quan, tôi không cần phải giải thích về nó. Tôi cũng sẽ không thử, vì vấn đề đó.
Rook

1
@Rook - Tôi nghĩ rằng hầu hết mọi người nhìn vào một biểu thức chính quy phức tạp, quyết định tất cả các biểu thức chính quy là xấu, và sau đó ngừng suy nghĩ. Thực tế là, chúng là một công cụ rất thanh lịch và biểu cảm nếu bạn có thể thiết lập định kiến ​​của mình về chúng. BTW, theo logic của riêng bạn, rất nhiều lập trình viên không thể làm đại số, vì vậy đại số có lẽ là xấu xa và nên được bãi bỏ vì nó rõ ràng không dễ hiểu.
Dan Ray

0

Con người là một sinh vật sử dụng công cụ và các biểu thức thông thường là những công cụ mạnh mẽ. Một phép ẩn dụ tốt đẹp cho các biểu thức thông thường là một máy thái thịt từ một món ăn ngon. Nếu bạn muốn những lát thịt gà tây mỏng như giấy, thịt bò nướng, v.v., đó chỉ là thứ. Tuy nhiên, bạn cần có đôi bàn tay khéo léo để sử dụng nó, bởi vì bạn có thể tự cắt mình rất tệ với nó và bạn sẽ không cảm thấy gì cho đến khi bạn nhìn thấy máu. Điều tôi muốn nói là điều này là vấn đề lớn với các biểu thức thông thường khiến chúng hơi bị tắt có nghĩa là bạn khớp với thứ gì đó bạn không nên hoặc ngược lại và bạn không phát hiện ra cho đến khi nó gây ra vấn đề trong quá trình.


0

Biểu thức thông thường là rất hấp dẫn bởi vì họ nắm giữ sức mạnh. Bạn có thể làm một công việc rất phức tạp trong rất ít nhân vật.

Vấn đề là cấu trúc biểu thức chính quy tiêu chuẩn không phải là Turing-perfect, điều đó có nghĩa là có những chương trình mà bạn đơn giản không thể thực hiện bằng biểu thức chính quy và mọi người không BIẾT rằng khi chúng bị thu hút bởi sức mạnh rõ ràng của biểu thức chính quy.

Điều này - tôi đoán - là lý do cho trích dẫn của "bây giờ họ có hai vấn đề".

Tôi đoán rằng các biểu thức chính quy của Perl là Turing-perfect, nhưng rõ ràng nó chưa được chứng minh một cách quyết đoán hoặc bị từ chối.


0

Bởi vì đó là một cách hiệu quả để lập trình một máy trạng thái hữu hạn, đây là một công cụ mạnh mẽ khi áp dụng. Về cơ bản, đây là ngôn ngữ riêng để lập trình các FSM, rất hữu ích nếu bạn biết ngôn ngữ này, gây phiền nhiễu nếu bạn không biết.


0

Trong Experencie của tôi, regexes giống như một nghệ thuật cổ xưa, một cái gì đó tối nghĩa, một số peolpe phẫn nộ vì họ không thể hiểu được phép thuật liên quan và có lẽ vì không ai sẽ giải thích chúng cho bạn. Tôi chưa nghe nói về các trường đại học dạy cho họ một cái gì đó tầm thường hơn là kết hợp một e-mail. Sau đó, có những hoạt động bên trong thần bí của nó, vì hầu hết mọi người không hiểu chúng, họ phải chậm . Và làm cho chúng hoạt động tốt trong lần thử đầu tiên luôn là một thách thức đối với người mới.

Điều tương tự có thể được nói về Perl, awk, Linux và tất cả mọi thứ không có nút sáng bóng hoặc cú pháp màu đẹp. Vì vậy, nó giống như thêm sự phức tạp vào "các nhiệm vụ tầm thường", chỉ cần ném một số vòng lặp, chia tách, một công tắc, một số phép thuật và đó là thứ gì đó có thể hoạt động. Nhưng tốt, nếu bạn ở phía bên kia đường, regex là những dụng cụ cắt cookie tuyệt đẹp trông giống như tín hiệu nhiễu mà không có bất kỳ vòng lặp khó chịu hay nhiều thứ để gỡ lỗi. Tôi thích họ cũng vì sự linh hoạt mà họ cung cấp. Khi mô hình phù hợp thay đổi, bạn chỉ cần thay đổi regex, không phải thuật toán hoặc công cụ / bất cứ điều gì, và nó rất hay và hoạt động trở lại. Và vì chúng là một chuỗi ma thuật, bạn có thể đặt nó bên ngoài mã nguồn nếu bạn muốn. Và một điều nữa khiến tôi nghĩ đến perl, nếu bạn viết một regex dài hơn 20 ký tự, nó cảm thấy rằng bạn đã hoàn thành rất nhiều, ít nhất là đối với tôi, nó thật gọn gàng và nhỏ gọn. Tôi cũng là một lập trình viên lười biếng, tôi không thích viết nhiều mã với nhận dạng và nhận xét đẹp và thêm một số lỗi vào hỗn hợp.

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.