Làm thế nào để bạn học biểu thức thường xuyên? [đóng cửa]


80

Tôi không hỏi học ở đâu . Tôi đã tìm thấy rất nhiều tài nguyên tốt trên mạng và sách, v.v.

Nhưng làm thế quái nào tôi giải quyết chúng. Đâu là bắt đầu của nó, kết thúc? Khi nào bộ xử lý regrec tiến lên trên văn bản, khi nào nó giữ vị trí của nó và thử một kết quả khớp khác? Vân vân.

Tôi cảm thấy như đang cố gắng tìm ra chữ tượng hình trên các kim tự tháp Ai Cập.


2
Sắp xếp theo chủ đề - chính quy-expressions.info . Sử dụng đề xuất này và @ Jalayn dưới đây. Học bằng cách làm!
Freiheit

6
gskinner.com/RegExr là công cụ tốt nhất để phát triển regex tôi đã tìm thấy.
Callum Rogers

Một chút thời gian. Bắt đầu với những thứ đơn giản ("aaa", "aa.", "A * b", v.v.) và làm việc theo cách của bạn đến các thành phần dành riêng cho việc triển khai (ví dụ PCRE). Sau đó đưa ra một mô hình và cố gắng tạo một regex phù hợp với nó.
tylerl

Tôi đã học được bằng cách dùng thử và lỗi với chương trình tuyệt vời RegexBuddy. regexbuddy.com (Tôi không nhận được tín dụng cho quảng cáo này, chương trình này thực sự làm cho nó dễ học)
Yam Marcovic

rubular.com là một công cụ tốt để phát triển regex.
Gazler

Câu trả lời:


68

Tôi nghĩ rằng kiến ​​thức về lý thuyết Automata là rất quan trọng để hiểu.

Một khi bạn hiểu máy tự động là gì và cách xác định ngôn ngữ thông thường , việc hiểu các biểu thức chính quy sẽ dễ dàng hơn nhiều.

Theo cú pháp cụ thể và sự khác biệt giữa các triển khai khác nhau ... Chà, một số điều bạn chỉ cần nhớ. Có những hỗ trợ cho điều đó, quá.

Biên tập

Một số ý kiến ​​dưới đây nêu lên những điểm quan trọng:

  1. Đừng quên rằng các biểu thức chính quy (như được thực hiện trong hầu hết các ngôn ngữ lập trình) là một siêu biểu thức của các biểu thức chính quy trong lý thuyết automata. Mặc dù nền tảng lý thuyết tốt là một nơi hữu ích để bắt đầu, nhưng nó sẽ không cho bạn biết tất cả mọi thứ. (Cảm ơn, David Thornley)

  2. Nhiều người bình luận nói rằng có thể học cú pháp regex khác nhau mà không cần học cơ sở lý thuyết. Mặc dù đúng là bạn có thể học cú pháp mà không hiểu đầy đủ về cách thức hoạt động của nó, nhưng ấn tượng của tôi là sự hiểu biết đầy đủ là những gì OP đã làm sau đó. Câu hỏi là về cơ sở thực tế: khi nào bộ xử lý tiến? Khi nào nó dừng lại? Làm thế nào nó quyết định rằng nó là một trận đấu? Đó là cơ sở, đó là lý thuyết, và nó dựa trên Lý thuyết Automata. Chắc chắn, bạn có thể lái xe mà không biết động cơ hoạt động như thế nào. Nhưng nếu bạn được hỏi "làm thế nào khí thực sự làm cho nó lái" - bạn phải nói về cách chế tạo động cơ, phải không?


Bình luận viên: nếu bạn muốn thảo luận về những điểm tốt hơn của câu hỏi này, vui lòng sử dụng trò chuyện . Mặt khác, vui lòng xem xét để lại một câu trả lời hoặc bỏ phiếu cho các câu trả lời mà bạn thấy là chính xác nhất.

Cảm ơn đã chỉnh sửa. Điều này làm cho câu trả lời này gần với sự thật hơn. Mặc dù tôi vẫn không nghĩ rằng bạn thực sự cần biết Lý thuyết Automata (tôi không biết điều đó, nhưng tôi vẫn có thể viết các biểu thức chính quy phức tạp), tôi đồng ý rằng một số kiến ​​thức về lý thuyết này có thể giúp ích. Đặc biệt là biết cách quay lui hoạt động và được kiểm soát bởi các bộ lượng hóa tham lam / không tham lam / sở hữu có thể thực sự giúp bạn hiểu.
NikiC

Chỉ 2 xu của tôi: trong loạt video gần đây về thư viện regex C ++ STL trong Kênh 9 của MSDN, người trình bày, cũng là người duy trì STL, nói rằng họ triển khai nó như một máy tự động. Vì vậy, biết lý thuyết này thực sự sẽ cung cấp cho OP một số hiểu biết về cách hoạt động của regex.
korbes

5
Tôi không đồng ý với tuyên bố mở đầu cả. Khi tôi học các biểu thức chính quy, tôi không biết gì về lý thuyết automata. Ba thập kỷ sau tôi vẫn không. Những gì tôi đã biết là làm thế nào để đọc một trang người đàn ông, lấy nó theo nghĩa đen và làm thế nào để thử nghiệm tại một dấu nhắc.
Bryan Oakley

1
@Bryan tốt ... kinh nghiệm của bạn loại chứng minh quan điểm. Bạn có thể biết cách sử dụng nó, nhưng bạn không thực sự hiểu cách thức hoạt động của nó. Nếu bạn làm thế - thì bạn sẽ biết điều gì đó về lý thuyết automata, ngay cả khi bạn không biết đặt tên cho nó. Nhưng bạn không thể hiểu đầy đủ các biểu thức chính quy mà không biết lý thuyết automata và dĩ nhiên không có số lượng trang đọc nào có thể giúp bạn ở đó (trừ khi bạn đang đọc các trang hướng dẫn giải thích lý thuyết automata).
littleadv

36

Bằng cách thực hành.

Tôi đã học được bằng cách vui chơi với web cào. Tôi chắc chắn rằng tôi đã không một mình làm điều đó chỉ để cho vui.

Một ví dụ: Viết một số mã lấy điểm bóng đá, tennis mới nhất (môn thể thao bạn thích trên thực tế) từ trang web thể thao yêu thích của bạn. Làm điều đó bằng cách viết một số mã để tải trang, trích xuất điểm số bằng các biểu thức thông thường và xuất chúng ra bàn điều khiển hoặc vào một số tệp văn bản. Hãy chắc chắn rằng với biểu thức chính quy bạn chọn, bạn chỉ lấy được điểm và không có gì khác. Đôi khi điều này có thể khá khó khăn :-)

Ví dụ thứ hai: Viết một số mã lấy hình ảnh của webcomic yêu thích của bạn, ( ví dụ tôi thích Sinfest rất nhiều) và lưu nó ở đâu đó trên ổ cứng của bạn. Chỉ sử dụng các biểu thức thông thường để truy xuất thẻ "img" và nội dung của nó. Tùy chọn cũng lấy lại tiêu đề của nó nếu nó được lưu trữ ở đâu đó.


15
Phân tích cú pháp HTML với các biểu thức thông thường nói chung là một ý tưởng tồi.
Tối đa

10
Tất nhiên đó là một ý tưởng tồi. Sử dụng trình phân tích cú pháp DOM / Sax hoặc các trình đọc XML chuyên dụng khác là những gì nên được sử dụng "nói chung". Nhưng chủ đề ở đây là về việc học các biểu thức chính quy và tôi đã chia sẻ cách tôi học về các biểu thức chính quy theo cách tôi nghĩ là một cách "vui vẻ".
Jalayn

3
Sử dụng trình phân tích cú pháp XML cho các trang web HTML thậm chí còn là một ý tưởng tồi tệ hơn so với việc loại bỏ chúng bằng các biểu thức thông thường.
skolima

8
À, tôi muốn chính xác hơn về những gì tôi nghĩ về điều đó nhưng tôi lười biếng và tôi chỉ phản ứng với nhận xét ... Tôi nghĩ rằng tất cả chúng ta có thể đồng ý rằng 1. sử dụng các biểu thức thông thường để phân tích toàn bộ tài liệu là một ý tưởng tồi 2. sử dụng trình phân tích cú pháp XML để phân tích HTML là một ý tưởng tồi 3. sử dụng trình phân tích cú pháp XML để phân tích XHTML là đúng 4. sử dụng các biểu thức thông thường để truy xuất một lớp hoặc một số thông tin rất cụ thể từ HTML là đúng. Hoặc tôi có thể tóm tắt lại: công cụ phù hợp cho công việc phù hợp ...
Jalayn

23

Tôi biết bạn không yêu cầu tài nguyên nhưng Làm chủ các biểu thức chính quy của Jeffrey EF Friedl là cách tôi học cách chúng hoạt động và cách sử dụng chúng. Ngay cả sau khi đến mức sử dụng rất nhiều trong số chúng để phân tích những thứ khác nhau, chương đầu tiên có những điều mới đối với tôi.

Bạn muốn hiểu những regrec chết tiệt? Đọc cuốn sách này.


2
Đây phải là câu trả lời dứt khoát.
mỏng

1
+100.000 Một trong những cuốn sách kỹ thuật tốt nhất từ ​​trước đến nay, và thuận tiện về chủ đề của câu hỏi.
Affe

Yêu cuốn sách này. Điểm chính là nó giúp tôi hiểu tất cả các chức năng khác nhau có sẵn trong Regex. Bạn sẽ không thể ghi nhớ tất cả cú pháp khi đọc một cuốn sách, nhưng cuốn sách sẽ cho bạn thấy tất cả những điều tồn tại để bạn biết bạn có công cụ gì để giải quyết vấn đề khi xuất hiện.
Kibbee

Hoàn toàn +1 cho câu trả lời này. Tôi bay đi ở regex cho đến khi cuối cùng tôi ngồi xuống và đọc từng dòng âm lượng cần thiết này. Bây giờ Friedl đã cho tôi đủ nền tảng để tôi có thể suy luận theo cách của mình thông qua tất cả các biến thể không chuẩn mà làm chúng ta thất vọng ngày hôm nay! Tôi đánh giá cao tài liệu tham khảo này cho OP và mọi người khác. +1 để @slim cho nhận xét của mình, cũng!
John Tobler

19

Đâu là bắt đầu của nó, kết thúc? Khi nào bộ xử lý regrec tiến lên trên văn bản, khi nào nó giữ vị trí của nó và thử một kết quả khớp khác? Vân vân.

Tôi sẽ bắt đầu bằng cách làm rõ mục tiêu của bạn và sau đó tìm ra cách học của bạn .

Điều gây ấn tượng với tôi về câu hỏi của bạn là bạn hỏi "làm thế nào để tôi học các biểu thức chính quy?" và sau đó ngay lập tức làm theo câu hỏi "làm thế nào để công cụ biểu thức chính quy hoạt động bên trong?" Bạn dường như đang ám chỉ rằng hai điều đó có liên quan đến nhau, đó là một điểm đáng nói. Có thể bạn là một người học cách làm một cái gì đó hoạt động bằng cách tách nó ra, hoặc bằng cách tự xây dựng nó.

Đối với các ứng dụng mới bắt đầu, thường không cần phải hiểu cách thức một công cụ hoạt động để sử dụng nó một cách hiệu quả. Bạn không cần biết làm thế nào một động cơ khoan hoạt động để đặt lỗ trên gỗ; bạn cần hiểu cách sử dụng máy khoan chứ không phải cách chế tạo máy khoan.

Vậy mục tiêu của bạn là gì? Bạn đang có ý định học cách xây dựng một công cụ biểu thức chính quy? hoặc bạn đang có ý định học cách sử dụng hiệu quả các biểu thức thông thường để giải quyết các vấn đề kinh doanh? Để đạt được những mục tiêu khác nhau có khả năng đòi hỏi các kỹ thuật học tập khác nhau.

Để giải quyết câu hỏi cụ thể của bạn về cách thức hoạt động của công cụ biểu thức chính quy: nó phụ thuộc. Cách tiếp cận lý thuyết "cổ điển" đối với các biểu thức chính quy là sử dụng biểu thức chính quy làm bản thiết kế cho một máy tự động hữu hạn không xác định, sau đó xây dựng máy tự động hữu hạn xác định tương đương, và sau đó thực hiện máy tự động đó chống lại đầu vào.

Hầu như không ai thực sự làm điều này vì nhiều lý do. Đầu tiên, số lượng trạng thái nhân với số lượng ký tự đầu vào có thể mang lại một bảng chuyển trạng thái rất lớn ngay cả đối với các biểu thức chính quy nhỏ. Chắc chắn, hầu hết những thứ đó có thể được nén, nhưng vẫn có rất nhiều quy tắc chuyển đổi. Thứ hai, các cách tiếp cận khác thường nhanh hơn. Thứ ba, các biểu thức được gọi là "thông thường" nằm trong các thư viện regrec hiện đại, không có gì thuộc loại này. Chúng không phải là ngôn ngữ thông thường chút nào; chúng thường được nhận ra bởi automata đẩy xuống, không phải ngôn ngữ automata hữu hạn.

(Tôi bắt đầu viết một loạt dài về cách tất cả các công cụ này hoạt động nhưng tôi chạy ra khỏi hơi nước sau khi chỉ có mười hai bài viết đầu tiên . Bạn có thể tìm thấy chúng thú vị nếu bạn muốn có một mồi ngắn gọn trên nền tảng lý thuyết của biểu thức thông thường cơ bản.)

Thay vào đó, các công cụ biểu thức chính quy thực sự thường sử dụng chiến lược quay lui. Công cụ biểu thức chính quy mà chúng tôi đã xây dựng cho công cụ JScript hơn một thập kỷ trước giờ đã biên dịch biểu thức chính quy thành ngôn ngữ mã byte bao gồm các nguyên hàm để nhận ra các chuỗi và quay lại các trạng thái trước đó. Sau đó, chúng tôi đã xây dựng một trình thông dịch cho ngôn ngữ mã byte đó.

Tôi sẽ không cố gắng hiểu làm thế nào một công cụ regrec hoạt động trước khi có một sự hiểu biết khá vững chắc về cách sử dụng các biểu thức thông thường. Tập trung vào đó trước khi bạn bắt đầu đào sâu vào các chiến lược tối ưu hóa các công cụ khác nhau.


+1 vì bạn giải quyết một số điều cần biết khi sử dụng biểu thức chính quy; Tuy nhiên, tôi không đồng ý với đánh giá của bạn rằng không cần thiết phải biết bên trong. Đối với khoan, bạn hoàn toàn đúng; trong máy tính, tôi đã phát hiện ra rằng sớm hơn tôi nghĩ, tôi đã đến lúc phải hiểu một thứ gì đó bên trong để làm chủ ứng dụng của nó - cho dù đó là C ++ (trình biên dịch), máy chủ web (HTTP) hay regexes (lý thuyết tự động) . Không đến mức tôi trở thành một chuyên gia, nhưng hiểu rõ về các nguyên tắc cơ bản thường là cách nhanh nhất để học.
Felix Dombek

3
@Felix: Tôi nghĩ rằng chúng tôi thực sự đồng ý. Tôi cho rằng, cho các ứng dụng mới bắt đầuthường không cần phải hiểu làm thế nào một công cụ làm việc để sử dụng nó. Những lời chồn đó là có chủ ý. Đối với người hành trình hoặc sử dụng thành thạo một công cụ, sẽ rất hữu ích để hiểu ít nhất một vài điều về nội bộ của nó để bạn có thể dự đoán chính xác nơi công cụ sẽ có hiệu suất kém, nói.
Eric Lippert

Hmm, tôi phải đồng ý một chút. Một số chương trình kinh doanh hữu ích nhất mà tôi đã xây dựng đã sử dụng lý thuyết tôi đã học trong lexx và yacc để giải quyết vấn đề một cách hiệu quả. Mặc dù vậy, bạn đã đúng, một sự hiểu biết ở cấp độ phd hoàn chỉnh là không cần thiết. Tôi sẽ phải đọc các bài đăng trên blog, chúng trông thú vị nhất.
Spencer Rathbun

Bạn nói rằng các biểu thức chính quy không phải là chính quy - nhưng tôi nghĩ rằng thế giới thông thường trong tên đang đề cập đến các biểu thức mà nó khớp - ví dụ: biểu thức chính quy "[0-9]{3}"có thể khớp với bất kỳ số có ba chữ số nào và số ba chữ số 480 là ví dụ cho một số thông thường biểu thức nó phù hợp.
cấu hình

1
@configurator: Theo định nghĩa, ngôn ngữ "thông thường" là ngôn ngữ có thể được nhận dạng bởi một máy tự động hữu hạn. Mỗi ngôn ngữ thông thường có thể được đặc trưng bởi một "biểu thức chính quy" chỉ bao gồm các hiệp hội, giải pháp thay thế, catenations và Ngôi sao Kleene. Nhưng hầu hết các công cụ "biểu thức chính quy" ngày nay nhận ra các ngôn ngữ phức tạp hơn các ngôn ngữ thông thường; ví dụ: ngôn ngữ của "câu có dấu ngoặc đơn được kết hợp chính xác" không thường xuyên, nhưng bạn có thể kết hợp nó với "biểu thức chính quy" trong một số công cụ regrec.
Eric Lippert

6

Làm thế quái nào tôi giải quyết chúng?

Giống như bất kỳ điều mới:

10 Study
20 Practice
30 goto 10

Học

Tôi thấy rằng hầu hết các giáo viên thành công bắt đầu dạy bất kỳ môn học nào bằng cách trước tiên cung cấp một chút nền tảng cho môn học. Điều quan trọng là có bối cảnh về những gì bạn đang học và quan trọng nhất là tại sao bạn học nó.

Đó là tất cả khớp chuỗi

Biểu thức chính quy là một phương tiện kết hợp các mẫu trong văn bản. Đó là một ngôn ngữ khai báo tự nó được tích hợp vào nhiều ngôn ngữ lập trình khác.

Tôi muốn nhấn mạnh rằng đó là một ngôn ngữ khai báo, biểu thức thông thường là hữu ích để thể hiện những gì chuỗi để phù hợp, nhưng họ không dưới mọi hình thức thể hiện như thế nào chương trình là để đi về làm việc phù hợp. Vì lý do này, có thể sử dụng các biểu thức chính quy rất nhanh và rất chậm trong cùng một ngôn ngữ lập trình chỉ bằng cách sử dụng trình phân tích cú pháp RegEx khác.

Lý do tạo các biểu thức chính quy là giống nhau cho việc tạo ra hầu hết các ngôn ngữ lập trình: các lập trình viên thấy mình thực hiện cùng một nhiệm vụ phức tạp và quyết định rằng họ muốn một cách viết mã đơn giản hơn.

Một số người sẽ (và nên) phàn nàn về câu trước của tôi bằng cách nói điều gì đó dọc theo dòng:

RegEx không làm cho chương trình đơn giản hơn.

đúng rồi

RegEx không làm cho chương trình trở nên đơn giản hơn, RegEx giúp việc viết chương trình đơn giản hơn. Bạn vẫn cần phải kỹ lưỡng trong thử nghiệm của mình để chắc chắn rằng tất cả các trường hợp chính xác đều được khớp chính xác, và tất cả các trường hợp không chính xác thì không. Thật khó để kiểm tra "tất cả", và với các mẫu phức tạp, thật khó để kiểm tra "hầu hết". Tệ nhất, bạn vẫn nên thử nghiệm "một số" trường hợp.

hãy kết hợp một số ví dụ mà tôi bắt buộc phải chọn công cụ RegEx của JavaScript vì tôi có thể kiểm tra nó trực tiếp trên trình duyệt một cách dễ dàng và vì tôi sẽ không phải thực hiện bất kỳ chuỗi thoát nào trong khi sử dụng bằng chữ RegEx.

Khi bạn thực hiện khớp chuỗi bình thường, bạn kiểm tra một giá trị chuỗi so với chuỗi khác. Chúng có thể đến từ bất cứ đâu, nhưng cuối cùng, phải mất hai chuỗi được so sánh với nhau:

if ( 'foo' == 'bar' ) doSomething();

Ví dụ đó thật tệ vì nó sẽ không bao giờ làm gì cả

if ( foo == 'bar' ) doSomething();

Tốt hơn nhiều; Bây giờ, chúng ta không thực sự biết trước liệu có nên làm điều gì đó hay không. Bây giờ chúng tôi có thể bắt đầu chấp nhận đầu vào của người dùng:

if ( prompt( 'Say "bar" to do something.' ) == 'bar' ) doSomething();

Thật tuyệt vời, giờ đây người dùng có thể nhập barvà điều gì đó sẽ xảy ra, cho đến khi bạn nhận được báo cáo lỗi từ người dùng nói rằng "bar"nó không hoạt động hoặc "BAR" không hoạt động hoặc họ đã gõ BRA100 lần và không có gì xảy ra.

Bỏ qua lỗi chính tả và các ký tự phụ 'bar' != 'BAR', và các lập trình viên cần nghĩ ra cách kiểm tra xem các ký tự là trường hợp sai.

Giải pháp đơn giản, sử dụng toLowerCase. Điều đó làm việc tuyệt vời, nhưng những người dùng của chúng tôi đang sử dụng tiếng Anh Anh hơn tiếng Anh Mỹ khi bạn kết hợp something == 'color'thì sao? Bây giờ bạn sẽ phải phù hợp something == 'color' || somthing == 'colour'.

Câu chuyện dài, các mẫu đơn giản biến thành rất nhiều mã lặp đi lặp lại rất nhanh.

Ví dụ màu có thể được kết hợp đơn giản với:

/colou?r/.test( something )

một sự hiểu biết vững chắc về những điều cơ bản của các biểu thức thông thường có thể làm giảm đáng kể lượng thời gian bạn lãng phí khi phát minh lại bánh xe.

Học ở đâu

Hầu hết các ngôn ngữ triển khai biểu thức chính quy đều có ít nhất một tài nguyên có sẵn cho cú pháp cụ thể sử dụng biểu thức chính quy trong ngôn ngữ đó. Một cho JavaScript có thể được tìm thấy trên MDN

đọc nó.
tất cả.
sau đó đọc lại

Phải mất thời gian để tìm hiểu, hãy coi đó là một khoản đầu tư: một giờ để học RegEx giờ sẽ tiết kiệm được một giờ vào lần tiếp theo bạn cần thực hiện một số mô hình chuỗi khớp, và sau đó một giờ nữa vào lần sau.

Thực hành

Sau khi đọc tất cả về RegEx, có lẽ bạn sẽ không hiểu hầu hết về nó. Đó là bởi vì bạn không thực sự làm bất cứ điều gì với nó.

Tôi đã đề cập đến lý do tại sao tôi chọn JS cho ví dụ này, tôi khuyên bạn nên làm phiền nó trong trình duyệt của bạn. Thật nhanh chóng và bạn có thể làm điều đó ngay trong thanh URL của mình.

JS có một vài cách khác nhau và đơn giản để sử dụng RegEx:

string.match( regex )
regex.exec( string )
regex.test( string )

Bắt đầu với một cái gì đó đơn giản như:

javascript:'color'.match(/colou?r/);

là một cách dễ dàng để có được chân của bạn trong cửa. Chơi với nó, phá vỡ nó xem những gì phù hợp, và những gì không.

Khi bạn gặp khó khăn trong thực hành, tiếp tục 30. Bạn cần đọc để tìm hiểu thêm, nhưng bạn cần thực hành để thực sự hiểu những gì bạn đã học.


+1 để đề xuất gây rối với JavaScript trong trình duyệt.
John Tobler

5

Brian Kernighan viết một bộ xử lý reg-ex đơn giản trong cuốn sách Beautiful Code . Tôi nhận ra rằng bạn không tìm kiếm tài nguyên, nhưng có thể giúp thấy một triển khai cơ bản ở bên trong.


"Bộ xử lý regex" được đề cập thực sự không thực hiện các bất đồng và với cách tiếp cận đã cho, rất khó để thêm chúng. Tôi thích cuốn sách, nhưng đây là một điều tôi thất vọng.
Felix Dombek

4

Trong phát triển bình thường, mã gỡ lỗi có thể cung cấp những hiểu biết rất hữu ích. Biểu thức thông thường không có gì khác nhau. Vì vậy, có nguy cơ phát ra âm thanh như quảng cáo, hãy lấy RegexBuddy . Nó có một công cụ tuyệt vời để hiển thị trực quan những gì động cơ đang làm khi nó xử lý biểu thức của bạn và chuỗi đầu vào.


1
+1, "Anh hùng Regex" cũng rất hay: regexhero.net/tester
Angelo

Regexbuddy là một trong những công cụ yêu thích của tôi. Xem chế độ xem dạng cây là vô cùng hữu ích, vì có thể kiểm tra ngay lập tức khi bạn tạo regex của mình. Tôi đã học được nhiều regex hơn mà không cố gắng học nó chỉ bằng cách sử dụng nó.
Chao

1
Tôi luôn thấy RegexBuddy thú vị, nhưng tôi không thích phải mua nó. Đối với thử nghiệm regex cơ bản, có nhiều tiện ích khác. Để xem một mô tả văn bản của regex mặc dù có ít công cụ hơn. Phiên bản trả phí của Regex Hero cũng vậy. Một điều khá độc đáo đối với RegexBuddy là Regex Debugger, cho thấy mỗi sự chấp nhận hoặc từ chối một nhân vật, và mỗi lần quay lại chi tiết khó hiểu, điều này thực sự có thể giúp ích khi gỡ rối một regex lớn và rất phức tạp. Tôi đã không nhận thấy bất kỳ công cụ khác mà làm điều đó.
Kevin Cathcart

3

Các biểu thức thông thường có thể trở nên rất phức tạp rất nhanh, vì vậy tôi khuyên bạn nên bắt đầu học nó bằng hướng dẫn. Biết rằng dạng biểu thức chính quy đơn giản nhất là một chuỗi biểu thị những gì bạn đang tìm kiếm. Thật không may, để có thể xác định các quy tắc tìm kiếm đặc biệt, nó yêu cầu một số ký tự nhất định và các ký tự này phải được thoát hoặc bạn đang tạo một biểu thức chính quy không hợp lệ hoặc không chính xác.

Lời khuyên của tôi là bắt đầu với một ví dụ về thứ gì đó bạn đang tìm kiếm và thoát khỏi nó. Vì vậy, nói cách khác, nếu bạn đang tìm kiếm bất cứ điều gì trong ngoặc đơn, hãy lấy một ví dụ về một chuỗi như vậy trong văn bản bạn đang tìm kiếm: (this is an example of something you'd want to find)

Bắt đầu bằng cách thoát các ký tự để bạn tìm kiếm ký tự theo nghĩa đen: \(this is an example of something you'd want to find\)

Kiểm tra nó, xác minh rằng nó tìm thấy ví dụ của bạn một cách chính xác. Sau đó, khái quát biểu thức để tìm bất kỳ văn bản như vậy, không chỉ là ví dụ bạn tìm thấy. Vì vậy, nó sẽ trở thành: \([^)]*\) (có nghĩa là bất kỳ ký tự nào không phải là ")" cho bất kỳ số lần xuất hiện nào, bao gồm 0).

Kiểm tra lại và xác minh rằng không chỉ tìm thấy ví dụ của bạn, mà những người khác cũng thích nó. Tìm kiếm các biểu thức chính quy phức tạp hơn nhưng thường xuyên hơn trên internet và vá chúng bằng các biểu thức chính quy hiện có của bạn để tránh phải lo lắng về mọi khả năng.

Đó là về nó. Và oh, học và yêu \ Q ... \ E. Trong hầu hết các ngôn ngữ biểu thức chính quy, \ Q chỉ ra sự bắt đầu của một mẫu chữ và \ E đánh dấu sự kết thúc, trong trường hợp bạn phải đối phó với việc tìm kiếm các mẫu đặc biệt tinh vi và không biết cách thoát chúng. Điều đó đã cứu cuộc đời tôi hơn một vài lần.


3

Tôi sẽ cho bạn một câu trả lời đơn giản cho một câu hỏi đơn giản. Trước tiên, bạn cần hiểu Biểu thức chính quy (RegEx) là gì - chúng làm gì, chúng được sử dụng để làm gì. Sau đó, một công cụ tuyệt vời để bắt đầu.

  1. Nó là gì? RegEx là một ngôn ngữ để thể hiện khớp mẫu. Điều đó có nghĩa là, bằng cách sử dụng nó, bạn có thể tạo ra một sự kết hợp của các ký tự nhận dạng hoặc tìm thấy các mẫu trong văn bản. Điều này hữu ích như thế nào? Trong lập trình, bạn có thể yêu cầu máy tính khớp văn bản từ một số nguồn (đầu vào của người dùng, trang web, v.v.) và phát hiện xem các phần tử văn bản cụ thể có được chứa trong đó hay không. Ví dụ: dấu chấm (.) Đại diện cho bất kỳ ký tự nào - chữ cái hoặc số. Các số trong dấu ngoặc nhọn biểu thị số lần lặp, vì vậy ". {1,30}" biểu thị bất kỳ ký tự nào, được lặp lại từ 1 đến 30 lần - nói cách khác, bạn không thể có một chuỗi trống và nó không thể dài hơn 30 nhân vật. Và nó tiếp tục từ đó.

  2. Làm thế nào để bắt đầu học? Công cụ tuyệt đối tốt nhất tôi từng thấy là Expresso , nhưng nó chỉ dành cho Windows. Nó có một GUI rất rộng, nơi bạn nhấp qua các yếu tố bạn muốn thêm vào biểu thức của mình, sau đó một người kiểm tra để kiểm tra nó dựa trên các đầu vào khác nhau để xem kết quả. Tôi chưa thấy bất cứ điều gì tốt trên Mac (nhưng tôi đang chạy Windows trên VMWare, vì vậy không thực sự cần phiên bản Mac), đã không dành nhiều thời gian để tìm kiếm trên Linux.


1
Cảm ơn các mẹo về Expresso. Tôi đã thử nó và nó là tuyệt vời!
Jim ở Texas

3

Ngoài một tài liệu tham khảo tốt, cách bạn thực sự học là sử dụng các công cụ học tập tốt. Một là sử dụng trình soạn thảo Vim mã nguồn mở , với hai tùy chọn được đặt:

  1. : đặt incsearch ... khi bạn nhập một mẫu tìm kiếm trên dòng lệnh, trình soạn thảo đang di chuyển đến đoạn văn bản đầu tiên khớp và làm nổi bật chính xác những gì phù hợp. Nếu bạn nhập một cái gì đó khiến nó không còn phù hợp với bất cứ thứ gì, Vim sẽ đưa con trỏ của bạn trở lại vị trí khi bạn bắt đầu.
  2. : set hlsearch ... điều này cho Vim hiển thị nền được tô sáng trên tất cả văn bản phù hợp với tìm kiếm RE hiện tại.

Cách khác là sử dụng một công cụ miễn phí gọi RegExCoach . Bạn dán vào văn bản mà bạn muốn tìm kiếm, sau đó trong một cửa sổ khác, bạn phát triển biểu thức chính quy của mình. Giống như Vim, nó làm nổi bật các trận đấu thành công khi đang bay.


RegExCoach hiện là phần mềm chia sẻ. Tôi thấy nó rất hữu ích trong việc phát triển các REs kiểu Perl phức tạp.
Firstrock

2

Bạn bắt đầu với một chuỗi so sánh cơ bản. Rất dễ dàng, nhưng cũng không mạnh mẽ.

Tiếp theo, có thể đã xảy ra với bạn, rằng bạn cần so sánh không phân biệt chữ hoa chữ thường, sao cho "Hy Lạp" và "GreeK" so sánh bằng nhau. Đây là một chút mạnh mẽ hơn.

Một ngày nào đó bạn nhận thấy những khác biệt nhỏ về chính tả không nên ngăn 2 từ so sánh bằng nhau: tức là "tổ chức" và "tổ chức" nên so sánh bằng nhau. Bạn ngồi xuống và viết một số mã làm điều này và bạn đang hạnh phúc.

Cho đến khi bạn trừu tượng hơn một chút và nhận ra rằng đôi khi bạn muốn tất cả các từ kết thúc bằng "ize" để so sánh bằng với anh em của họ trong chính tả tiếng Anh. Hoặc, sự lặp lại của một số chuỗi một số lần nhất định. Và, tất nhiên, bạn cần phải kết hợp tất cả những điều đó.

Và như vậy. Cuối cùng, rất có thể bạn sẽ kết thúc với một số ký hiệu mà không phải mọi nhân vật đều đại diện cho chính nó. Không có gì khác là một regrec. Người ta có thể xem nó như mô tả của một chuỗi các chuỗi.

Và sau đó, nó khá dễ dàng và đi theo 3 nguyên tắc cơ bản sau:

Bạn có các biểu thức cơ bản: ký tự đại diện cho chính chúng, các lớp ký tự, viết tắt tiện dụng và không tiện dụng cho các lớp ký tự như \ d hoặc \ p {Lu} cho các chữ cái viết hoa.

Và sau đó, bạn có một số khả năng để kết hợp chúng: nếu r1 và r2 là regexps, thì r1r2 r1 | r2 (r1) cũng vậy.

Cuối cùng, nhưng không kém phần sửa đổi lặp lại: r? r * r + r {n, m}

Đây là hầu hết bạn cần biết. Bất cứ điều gì khác bạn có thể tra cứu khi bạn cần nó.


2

Hai câu trả lời hay khác cho bạn biết lý thuyết đằng sau các biểu thức chính quy, và thực hành, đó là cả hai lời khuyên tuyệt vời. Tôi cũng khuyên bạn nên có một công cụ regex trực quan tốt để giúp bạn nếu bạn nghiêm túc.

Ví dụ, RegexBuddy có chế độ gỡ lỗi trực quan cho phép bạn thực hiện bước thực thi của regex và hiển thị cho bạn qua phần tô sáng và văn bản giải thích những gì công cụ regex đang làm ở mỗi bước. Có một video chứng minh việc gỡ lỗi này trên trang web của họ.


2

Tất cả mọi thứ chúng tôi có thể cung cấp cho bạn là nhiều tài nguyên hơn để học hỏi. Câu hỏi này tự nó là một tài nguyên.

Nhân tiện, tôi đã học được các biểu thức chính quy khá dễ dàng từ trang web này: http://www.THER-expressions.info/


1

Đối với tôi, nhìn thấy những gì regrec phù hợp khi tôi đang xây dựng nó thực sự giúp cuộc sống của tôi dễ dàng hơn và đã giúp tôi hiểu rõ hơn về chúng.

Để làm điều này, tôi sẽ mở một tệp có văn bản đích trong Emacs, và sau đó sử dụng isearch-forward-regexplệnh. Khi bạn nhập regrec, Emacs cho bạn thấy nó phù hợp với cái gì (đó là phần "isearch").

Để chạy lệnh, trong Emacs, bạn có thể sử dụng <ESC>xisearch-forward-regexp.


1

Tôi đã học các biểu thức chính quy bằng cách học flex và bison, được sử dụng để xây dựng các trình phân tích và phân tích từ vựng. Bạn không thể có một trình phân tích cú pháp mà không có các biểu thức thông thường, và cuốn sách lexx và yacc cực kỳ tốt trong việc đi qua lý thuyết mà không di chuyển quá nhanh.

Về cơ bản, thực tế tất cả các công cụ regex ngày nay đều tuân theo các nguyên tắc giống nhau. Chúng đều là những cỗ máy trạng thái hữu hạn và nếu bạn thực sự mò mẫm điều đó, thì bạn sẽ nắm bắt được hầu hết mọi mã bạn viết. Nó tương tự như học đệ quy ở chỗ, một khi bạn có được nó, bạn áp dụng nó cho các vấn đề theo bản năng. Chúng dễ dàng giải quyết bằng công cụ phù hợp, nhưng rất khó nếu không có nó.

Một điều khác về việc học lexx và yacc, so với các biểu thức thông thường, là bạn học cách chúng hoạt động nội bộ. Làm thế nào chương trình nhìn về phía trước, tại sao nó kết thúc một trận đấu, làm thế nào nó giữ dữ liệu và nhiều hơn nữa. Hiểu con trỏ là điều bắt buộc, nhưng nếu bạn có được lexx và yacc, và vượt qua nó ngay từ đầu, bạn sẽ học mọi thứ bạn yêu cầu và có một công cụ mạnh mẽ cho phần còn lại của sự nghiệp.

Câu hỏi này bao gồm một loạt các tài nguyên cho việc học và một bộ xương flex tôi đã ném vào nhau.


1

Trước đây, trước tiên tôi cố gắng đảm bảo rằng không có cách nào dễ dàng hơn để giải quyết vấn đề / "token hóa" chuỗi.

Khi bạn không thể tìm thấy một cái, tôi xem nó như một vấn đề không phải là cố gắng khớp với những gì bạn muốn ra khỏi chuỗi, thay vào đó, đó là vấn đề KHÔNG khớp với những gì bạn không muốn. Điều này chủ yếu là vì regex là tham lam. Nhưng nó đã phục vụ tôi tốt như một cách tiếp cận để có được những gì tôi muốn.

Đây là một ví dụ:

string = "Sep 22 19:57:38 host fcron[9137]: \
          Job fbsetbg -r $HOME/backgrounds/ \
          started for user user (pid 9138)"

để phù hợp với phút:

string.match /^\w+\s\d+\s\d+:(\d+):\d+\s\w+\s/ # correct but bad
string.match /\d+:([^:]+):\d+/                 # correct and good

Thay vì cố gắng tìm thời gian cùng với mọi thứ khác, hãy cố gắng tìm ranh giới riêng biệt.

Ví dụ này là một chút giả tạo, nhưng tất cả những gì tôi có thể đưa ra.


1

Một cách tiếp cận tôi đã sử dụng là tìm một loạt các dự án nguồn mở cần cập nhật cú pháp và sau đó viết một tập lệnh sed ngày càng phức tạp, bao gồm nhiều biểu thức thông thường.

Kịch bản cần thiết để chạy với nhiều tệp khác nhau trong mỗi dự án nguồn mở. Sau đó được chạy chống lại nhiều dự án khác nhau với phong cách khác nhau. Tôi bắt đầu với một cái gì đó rất đơn giản như %s/before/after sau đó tôi thấy rằng nó phù hợp với quá nhiều trường hợp. Vì vậy, tôi đã thêm nhiều thứ để ngăn chặn điều đó. Sau đó, tôi tìm thấy các dự án khác nhau bằng cách sử dụng các kiểu cú pháp khác nhau cần các thay đổi khác nhau.

Cuối cùng, tôi đã kết thúc với

  • kỹ năng và kiến ​​thức tuyệt vời về biểu thức chính quy
  • kỹ năng tốt với sed
  • giúp đỡ nhiều dự án nguồn mở
  • nhận được rất nhiều hoạt động đóng góp được hiển thị trên hồ sơ github của tôi
  • một công cụ 'dao quân đội' tốt khác cho công cụ ảo

và đã được giúp đỡ trong cách tiếp cận này bởi sự cần thiết phải

  • đạt được mục tiêu thực tế mà không gian lận
  • sử dụng các kỹ năng (regex) như một phần của mục tiêu lớn hơn với động lực lớn hơn.
  • có thể hiển thị bằng chứng về các kỹ năng tôi đã học bằng cách thay đổi mã người khác và sau đó xem xét các thay đổi.

Tôi cũng sẽ thông qua rằng có một loạt các trang web cho các ngôn ngữ khác nhau - ruby, javascript, v.v. sẽ cho phép bạn chơi xung quanh với các biểu thức và văn bản mẫu để thỏa mãn ngay lập tức. Đó là:

regexes trong nhiều ngôn ngữ trên một trang web

tập trung vào các nhóm trận đấu:


0

Tôi đã tìm thấy việc học các biểu thức chính quy tương tự như học các bảng nhân - vâng, bạn cần hiểu các ý tưởng đằng sau nó, nhưng cuối cùng, bạn chỉ cần thực hiện thường xuyên và lặp đi lặp lại.

Khi tôi đang học, tôi sẽ đặt cho mình một mục tiêu là thực hiện một vài bài tập regex mỗi ngày. Trong thực tế, điều này có nghĩa là ít nhất một lần một ngày, tôi sẽ cố gắng nhìn vào một chuỗi hoặc văn bản trên màn hình của mình và đưa ra một thách thức - "tôi có thể lấy tất cả các địa chỉ email ra khỏi đây không" hoặc "tìm tất cả lần xuất hiện của từ 'mã' được sử dụng như một động từ chứ không phải là danh từ, "những thứ như thế.

Làm điều đó trong một vài tuần thực sự đã được đền đáp - và tất nhiên, đánh giá định kỳ và làm mới là cần thiết. Tôi sắp có một.

Tôi cũng thấy công cụ trực tuyến này hữu ích vì nó cho phép tôi kiểm tra regex trong thời gian thực: http://www.gethifi.com/tools/regex

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.