Bagaimana Anda belajar Ekspresi Reguler? [Tutup]

80

Saya tidak bertanya di mana harus belajar. Saya telah menemukan banyak sumber daya online, dan buku, dll.

Tapi bagaimana cara saya mengatasinya. Di mana awal itu, akhirnya? Kapan prosesor regexp maju pada teks, kapan prosesor bertahan dan mencoba kecocokan lainnya? dll.

Saya merasa ingin mencoba mencari hieroglif pada piramida Mesir.

dumbBoy
sumber
2
Semacam pada topik - regular-expressions.info . Gunakan saran ini dan @ Jalayn di bawah ini. Belajar sambil bekerja!
Freiheit
6
gskinner.com/RegExr adalah alat terbaik untuk mengembangkan regex yang saya temukan.
Callum Rogers
Sedikit demi sedikit. Mulailah dengan hal-hal sederhana ("aaa", "aa.", "A * b", dll.) Dan lanjutkan dengan komponen-komponen khusus implementasi (yaitu PCRE). Kemudian muncul dengan pola dan cobalah untuk membuat regex yang cocok.
tylerl
Saya belajar dengan coba-coba dengan program hebat RegexBuddy. regexbuddy.com (Saya tidak mendapatkan kredit untuk iklan ini, program ini benar-benar membuatnya mudah dipelajari)
Yam Marcovic
rubular.com adalah alat yang bagus untuk mengembangkan regex.
Gazler

Jawaban:

68

Saya pikir pengetahuan teori Automata sangat penting untuk dipahami.

Setelah Anda memahami apa yang dimaksud dengan otomat, dan bagaimana bahasa reguler didefinisikan, memahami ekspresi reguler akan jauh lebih mudah.

Mengenai sintaks khusus dan perbedaan antara berbagai implementasi ... Ya, beberapa hal yang harus Anda ingat. Ada alat bantu untuk itu juga.

Sunting

Beberapa komentar di bawah ini mengangkat poin penting:

  1. Jangan lupa bahwa ekspresi reguler (seperti yang diterapkan dalam sebagian besar bahasa pemrograman) adalah superset dari ekspresi reguler dalam teori automata. Meskipun latar belakang teoretis yang baik adalah tempat yang berguna untuk memulai, itu tidak akan memberi tahu Anda segalanya. (Terima kasih, David Thornley)

  2. Banyak komentator mengatakan bahwa adalah mungkin untuk mempelajari berbagai sintaks regex tanpa mempelajari dasar teoretis. Meskipun benar bahwa Anda dapat mempelajari sintaksis tanpa sepenuhnya memahami cara kerjanya, kesan saya bahwa pemahaman penuh adalah apa yang diinginkan OP. Pertanyaannya adalah tentang dasar yang sebenarnya: kapan prosesor maju? Kapan itu berhenti? Bagaimana memutuskan bahwa itu cocok? Itulah dasarnya, itulah teorinya, dan didasarkan pada Teori Automata. Tentu, Anda bisa mengendarai mobil tanpa tahu bagaimana mesin bekerja. Tetapi jika Anda ditanya "bagaimana gas itu benar-benar menggerakkannya" - Anda harus berbicara tentang bagaimana mesin dibuat, bukan?

littleadv
sumber
Komentator: jika Anda ingin membahas poin-poin penting dari pertanyaan ini, silakan gunakan obrolan . Kalau tidak, silakan pertimbangkan untuk meninggalkan jawaban atau memilih jawaban yang menurut Anda paling benar.
Terima kasih atas hasil editnya. Ini membuat jawaban ini jauh lebih dekat dengan kebenaran. Meskipun saya masih tidak berpikir bahwa Anda benar-benar perlu tahu Teori Automata (saya tidak tahu itu, tapi saya masih bisa menulis ekspresi reguler yang kompleks), saya setuju bahwa beberapa pengetahuan tentang teori dapat membantu. Terutama mengetahui bagaimana backtracking bekerja dan dikendalikan oleh quantif serakah / ungreedy / posesif dapat benar-benar membantu pemahaman Anda.
NikiC
Hanya 2 sen saya: dalam seri video terbaru tentang C ++ STL library regex di Channel 9 MSDN, presenter, yang juga merupakan pengelola STL, mengatakan bahwa mereka mengimplementasikannya sebagai automata. Jadi mengetahui teori ini harus benar-benar memberikan OP beberapa wawasan tentang cara kerja regex.
korbes
5
Saya tidak setuju dengan pernyataan pembukaan sama sekali. Ketika saya belajar ekspresi reguler, saya tidak tahu apa-apa tentang teori automata. Tiga dekade kemudian saya masih belum. Yang saya tahu adalah bagaimana membaca halaman manual, menerimanya secara harfiah, dan bagaimana cara bereksperimen saat diminta.
Bryan Oakley
1
@Bryan yah ... Pengalaman Anda membuktikan hal itu. Anda mungkin tahu cara menggunakannya , tetapi Anda tidak benar-benar mengerti cara kerjanya. Jika Anda melakukannya - maka Anda tahu sesuatu tentang teori automata, bahkan jika Anda tidak tahu untuk menyebutkannya. Tetapi Anda tidak dapat memahami ekspresi reguler sepenuhnya tanpa mengetahui teori automata, dan tidak ada jumlah halaman manual yang dapat membantu Anda di sana (kecuali Anda membaca halaman manual yang menjelaskan teori automata, tentu saja).
littleadv
36

Dengan berlatih.

Saya belajar dengan bersenang-senang dengan memo web. Saya yakin saya tidak sendirian melakukan itu hanya untuk bersenang-senang.

Satu contoh: Tulis beberapa kode yang mengambil sepak bola terbaru, tenis (olahraga yang Anda sukai sebenarnya) mendapat skor dari situs web olahraga favorit Anda. Lakukan dengan menulis beberapa kode untuk memuat halaman, ekstrak skor dengan ekspresi reguler dan output ke konsol atau ke beberapa file teks. Pastikan bahwa dengan ekspresi reguler yang Anda pilih, Anda hanya mengambil skor, dan tidak ada yang lain. Kadang-kadang ini bisa sangat menantang :-)

Contoh kedua: Tulis beberapa kode yang mengambil gambar webcomic favorit Anda, (saya suka Sinfest misalnya) dan menyimpannya di suatu tempat di hard drive Anda. Gunakan hanya ekspresi reguler untuk mengambil tag "img" dan kontennya. Opsional juga mengambil judulnya jika disimpan di suatu tempat.

Jalayn
sumber
15
Parsing HTML dengan ekspresi reguler umumnya adalah ide yang buruk.
Maks.
10
Tentu saja itu ide yang buruk. Menggunakan parser DOM / Sax atau pembaca XML khusus lainnya adalah apa yang harus digunakan "secara umum". Tetapi topik di sini adalah tentang belajar ekspresi reguler, dan saya membagikan bagaimana saya belajar tentang ekspresi reguler dengan cara yang saya pikir adalah cara yang "menyenangkan".
Jalayn
3
Menggunakan parser XML untuk halaman web HTML adalah ide yang lebih buruk daripada menggoresnya dengan ekspresi reguler.
skolima
8
Ah well, saya ingin lebih tepatnya pada apa yang saya pikirkan tentang itu tetapi saya malas dan saya hanya bereaksi pada komentar ... Saya pikir kita semua bisa setuju bahwa 1. menggunakan ekspresi reguler untuk mengurai seluruh dokumen adalah ide yang buruk 2. menggunakan parser XML untuk mem-parsing HTML adalah ide yang buruk 3. menggunakan parser XML untuk mem-parsing XHTML benar 4. menggunakan ekspresi reguler untuk mengambil satu-liner atau beberapa informasi yang sangat spesifik dari HTML benar. Atau saya dapat meringkasnya: alat yang tepat untuk pekerjaan yang tepat ...
Jalayn
23

Saya tahu Anda tidak meminta sumber daya tetapi Menguasai Ekspresi Reguler oleh Jeffrey EF Friedl adalah bagaimana saya belajar cara kerjanya dan bagaimana menggunakannya. Bahkan setelah sampai pada titik menggunakan banyak dari mereka untuk mengurai hal-hal yang berbeda, bab pertama memiliki hal-hal baru untuk saya.

Anda ingin memahami regexp sialan itu? Baca buku ini.

Arkh
sumber
2
Ini harus menjadi jawaban yang pasti.
langsing
1
+100.000 Salah satu buku teknis terbaik yang pernah ada, dan dengan mudah membahas topik pertanyaan.
Affe
Saya suka buku ini. Poin utamanya adalah membantu saya memahami semua fungsi berbeda yang tersedia di Regex. Anda tidak akan dapat menghafal semua sintaksis dari membaca buku, tetapi buku itu akan menunjukkan kepada Anda semua hal yang ada sehingga Anda tahu alat apa yang Anda miliki untuk menyelesaikan masalah ketika itu datang.
Kibbee
Benar-benar memberi +1 untuk jawaban ini. Saya memukul regex sampai akhirnya saya duduk dan membaca volume penting ini baris demi baris. Sekarang Friedl memberi saya cukup banyak fondasi sehingga saya bisa menjelaskan semua variasi non-standar yang mengganggu kami hari ini! Saya sangat merekomendasikan referensi ini ke OP dan semua orang. +1 ke @slim untuk komentarnya, juga!
John Tobler
19

Di mana awal itu, akhirnya? Kapan prosesor regexp maju pada teks, kapan prosesor bertahan dan mencoba kecocokan lainnya? dll.

Saya akan mulai dengan menjelaskan tujuan Anda dan kemudian mencari tahu gaya belajar Anda .

Apa yang mengejutkan saya tentang pertanyaan Anda adalah Anda bertanya "bagaimana cara belajar ekspresi reguler?" dan kemudian segera ikuti itu dengan pertanyaan "bagaimana cara kerja mesin ekspresi reguler secara internal?" Anda tampaknya menyiratkan bahwa kedua hal itu ada hubungannya dengan satu sama lain, yang merupakan poin penting. Mungkin Anda adalah orang yang mempelajari cara kerja sesuatu dengan memisahkannya, atau dengan membangunnya sendiri.

Untuk aplikasi pemula, biasanya tidak perlu memahami cara kerja alat untuk menggunakannya secara efektif. Anda tidak perlu tahu bagaimana motor bor bekerja untuk melubangi kayu; Anda perlu memahami cara menggunakan bor, bukan cara membuat bor.

Jadi, apa tujuan Anda? Apakah Anda bermaksud mempelajari cara membuat mesin ekspresi reguler? atau apakah Anda bermaksud mempelajari cara efektif menggunakan ekspresi reguler untuk menyelesaikan masalah bisnis? Mencapai tujuan yang berbeda tersebut kemungkinan membutuhkan teknik pembelajaran yang berbeda.

Untuk menjawab pertanyaan spesifik Anda tentang cara kerja mesin ekspresi reguler: itu tergantung. Pendekatan teoritis "klasik" untuk ekspresi reguler adalah dengan menggunakan ekspresi reguler sebagai cetak biru untuk otomat terbatas nondeterministik, kemudian membangun otomat terbatas hingga deterministik yang setara, dan kemudian jalankan otomat itu terhadap input.

Hampir tidak ada yang benar-benar melakukan ini karena beberapa alasan. Pertama, jumlah negara dikalikan dengan jumlah karakter input yang mungkin menghasilkan tabel transisi keadaan yang sangat besar bahkan untuk ekspresi reguler kecil. Tentu, sebagian besar bisa dikompresi, tapi tetap saja, itu banyak aturan transisi. Kedua, pendekatan lain biasanya lebih cepat. Ketiga, apa yang disebut ekspresi "reguler" ada di perpustakaan regexp modern, tidak seperti itu. Mereka bukan bahasa biasa sama sekali; mereka sering dikenali oleh pushdown automata, bukan bahasa automata terbatas.

(Saya mulai menulis seri panjang tentang bagaimana semua ini bekerja tetapi saya kehabisan tenaga setelah hanya dua belas artikel pertama . Anda mungkin menemukan mereka menarik jika Anda ingin primer singkat tentang latar belakang teoritis dari ekspresi reguler dasar.)

Mesin ekspresi reguler yang sebenarnya biasanya menggunakan strategi backtracking. Mesin ekspresi reguler yang kami buat untuk mesin JScript lebih dari satu dekade yang lalu sekarang mengkompilasi ekspresi reguler menjadi bahasa bytecode yang mencakup primitif untuk mengenali urutan dan mundur ke keadaan sebelumnya. Kami kemudian membangun sebuah interpreter untuk bahasa bytecode itu.

Saya tidak akan mencoba memahami bagaimana mesin regexp bekerja sebelum memiliki pemahaman yang cukup kuat tentang bagaimana menggunakan ekspresi reguler. Berkonsentrasilah pada hal itu sebelum Anda mulai menggali berbagai strategi optimasi berbagai mesin.

Eric Lippert
sumber
+1 karena Anda membahas beberapa hal yang perlu diketahui saat menggunakan regex; Namun saya tidak setuju pada penilaian Anda bahwa tidak perlu mengetahui bagian dalam. Untuk pengeboran, Anda sepenuhnya benar; di komputer, saya telah menemukan bahwa lebih cepat dari yang saya pikirkan pada awalnya, saya sampai pada titik di mana saya harus memahami bagian dalam sesuatu untuk menguasai aplikasinya - apakah itu C ++ (kompiler), server web (HTTP), atau regex (teori automata) . Bukan sampai pada titik di mana saya menjadi seorang ahli, tetapi pemahaman yang baik tentang prinsip-prinsip yang mendasarinya seringkali merupakan cara tercepat untuk belajar.
Felix Dombek
3
@ Feliks: Saya pikir kita benar-benar setuju. Saya mengatakan bahwa untuk aplikasi pemula ada biasanya tidak perlu memahami bagaimana alat bekerja untuk menggunakannya. Kata-kata musang itu disengaja. Untuk pekerja harian atau ahli penggunaan alat, sangat membantu untuk memahami setidaknya sesuatu tentang internal sehingga Anda dapat secara akurat memprediksi di mana alat akan memiliki kinerja yang buruk, katakanlah.
Eric Lippert
Hmm, saya harus agak tidak setuju. Beberapa program bisnis paling berguna yang saya bangun telah menggunakan teori yang saya pelajari dalam lexx dan yacc untuk menyelesaikan masalah secara efisien. Anda benar, pemahaman tingkat phd yang lengkap tidak diperlukan. Saya harus membaca posting blog, mereka terlihat paling menarik.
Spencer Rathbun
Anda mengatakan bahwa ekspresi reguler tidak teratur - tetapi saya pikir dunia reguler dalam nama mengacu pada ekspresi yang cocok - misalnya ekspresi reguler "[0-9]{3}"yang dapat cocok dengan angka tiga digit, dan tiga digit angka 480 adalah contoh untuk regular ekspresi yang cocok.
konfigurator
1
@configurator: Bahasa "reguler" secara definisi adalah bahasa yang dapat dikenali oleh robot terbatas. Setiap bahasa reguler dapat ditandai dengan "ekspresi reguler" yang hanya terdiri dari persatuan, alternatif, katenasi, dan Bintang Kleene. Tetapi kebanyakan "ekspresi reguler" mesin hari ini mengenali bahasa yang lebih kompleks daripada bahasa biasa; misalnya, bahasa "kalimat dengan tanda kurung yang cocok dengan benar" tidak teratur, tetapi Anda dapat mencocokkannya dengan "ekspresi reguler" di beberapa mesin regexp.
Eric Lippert
6

Bagaimana cara saya mengatasinya?

Suka hal baru apa pun:

10 Study
20 Practice
30 goto 10

Belajar

Saya menemukan bahwa sebagian besar guru yang sukses mulai mengajar mata pelajaran apa pun dengan terlebih dahulu memberikan sedikit latar belakang untuk mata pelajaran tersebut. Penting untuk memiliki konteks tentang apa yang Anda pelajari dan, yang paling penting, mengapa Anda mempelajarinya.

Ini semua string yang cocok

Ekspresi Reguler adalah cara mencocokkan pola dalam teks. Ini adalah bahasa deklaratif itu sendiri yang dimasukkan ke berbagai bahasa pemrograman lainnya.

Saya ingin menekankan bahwa ini adalah bahasa deklaratif, ekspresi reguler berguna untuk mengekspresikan string mana yang cocok, tetapi mereka tidak dengan cara apa pun mengungkapkan bagaimana program harus melakukan pencocokan. Untuk alasan ini dimungkinkan untuk menggunakan ekspresi reguler dengan sangat cepat dan sangat lambat dalam bahasa pemrograman yang sama hanya dengan menggunakan parser RegEx yang berbeda.

Alasan untuk membuat ekspresi reguler adalah sama untuk pembuatan sebagian besar bahasa pemrograman: programmer menemukan diri mereka melakukan tugas rumit yang sama berulang-ulang dan memutuskan mereka menginginkan cara yang lebih sederhana untuk menulis kode.

Beberapa orang akan (dan harus) mengeluh tentang hukuman saya sebelumnya dengan mengatakan sesuatu seperti:

RegEx tidak membuat program lebih sederhana.

itu benar

RegEx tidak membuat program lebih sederhana, RegEx membuat penulisan program lebih sederhana. Anda masih harus teliti dalam pengujian Anda untuk memastikan bahwa semua kasus yang benar cocok dengan benar, dan semua kasus yang salah tidak. Sangat sulit untuk menguji "semua", dan dengan pola yang rumit, sangat sulit untuk menguji "sebagian besar". Paling buruk, Anda masih harus menguji "beberapa" kasus.

mari kita sertakan beberapa contoh. Saya telah secara wajib memilih mesin RegEx JavaScript karena saya dapat mengujinya langsung di browser dengan mudah dan karena saya tidak perlu melakukan string yang keluar saat menggunakan RegEx literal.

Ketika Anda melakukan pencocokan string normal, Anda menguji satu nilai string terhadap yang lain. Mereka dapat datang dari mana saja, tetapi pada akhirnya dibutuhkan dua string yang dibandingkan satu sama lain:

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

Contoh itu menyebalkan karena tidak akan pernah melakukan apa pun

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

Jauh lebih baik; sekarang, kita tidak benar-benar tahu sebelumnya apakah sesuatu akan dilakukan atau tidak. Kami sekarang dapat mulai menerima input pengguna:

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

Luar biasa, sekarang pengguna dapat memasukkan bardan sesuatu akan terjadi, sampai Anda mendapatkan laporan bug dari pengguna yang mengatakan itu "bar"tidak berfungsi, atau bahwa "BAR" tidak berfungsi, atau bahwa mereka telah mengetik BRA100 kali dan tidak pernah terjadi apa-apa.

Mengabaikan kesalahan ejaan dan karakter tambahan 'bar' != 'BAR', dan programmer perlu memikirkan cara menguji di mana karakter merupakan kasus yang salah.

Solusi sederhana, gunakan toLowerCase. Itu bekerja dengan sangat baik, tetapi bagaimana dengan pengguna kami yang menggunakan Bahasa Inggris British daripada Bahasa Inggris Amerika saat Anda cocok something == 'color'? Sekarang Anda harus mencocokkan something == 'color' || somthing == 'colour'.

Singkatnya, pola-pola sederhana berubah menjadi banyak kode berulang sangat cepat.

Contoh warna dapat dengan mudah dicocokkan dengan:

/colou?r/.test( something )

pemahaman yang kuat tentang dasar-dasar ekspresi reguler dapat secara signifikan mengurangi jumlah waktu yang Anda buang untuk menciptakan kembali roda.

Tempat belajar

Sebagian besar bahasa yang menerapkan ekspresi reguler memiliki setidaknya satu sumber daya yang tersedia untuk sintaks tertentu menggunakan ekspresi reguler dalam bahasa itu. Satu untuk JavaScript dapat ditemukan di MDN

membacanya.
semua itu.
lalu baca lagi.

Butuh waktu untuk belajar, menganggapnya sebagai investasi: satu jam untuk belajar RegEx sekarang menghemat satu jam saat berikutnya Anda perlu melakukan beberapa pencocokan pola string, dan kemudian satu jam lagi di waktu berikutnya setelah itu.

Praktek

Setelah membaca semua tentang RegEx, Anda mungkin tidak akan mengerti sebagian besar dari itu. Itu karena Anda sebenarnya tidak melakukan apa - apa dengannya.

Saya menyebutkan mengapa saya memilih JS untuk contoh ini, saya mendorong Anda untuk mengacaukannya di browser Anda. Ini cepat, dan Anda bisa melakukannya dengan benar di bilah URL Anda.

JS memiliki beberapa cara berbeda dan sederhana dalam menggunakan RegEx:

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

Dimulai dengan sesuatu yang sederhana seperti:

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

adalah cara mudah untuk mendapatkan kaki Anda di pintu. Bermain dengannya, pecahkan apa yang cocok, dan apa yang tidak.

Ketika Anda terjebak pada latihan, teruskan 30. Anda perlu membaca untuk belajar lebih banyak, tetapi Anda perlu berlatih untuk benar-benar memahami apa yang telah Anda pelajari.

zzzzBov
sumber
+1 untuk merekomendasikan mengotak-atik JavaScript di browser.
John Tobler
5

Brian Kernighan menulis prosesor reg-ex sederhana dalam buku Kode Indah . Saya menyadari Anda tidak mencari sumber daya, tetapi mungkin membantu untuk melihat implementasi dasar , di dalam.

Michael Easter
sumber
"Prosesor regex" yang disebutkan sebenarnya tidak mengimplementasikan disjungsi, dan dengan pendekatan yang diberikan, sangat sulit untuk menambahkannya. Saya suka buku itu, tetapi ini adalah satu hal yang membuat saya kecewa.
Felix Dombek
4

Dalam perkembangan normal, kode debug dapat memberikan wawasan yang sangat berguna. Ekspresi reguler tidak berbeda. Jadi, dengan risiko terdengar seperti iklan, dapatkan RegexBuddy . Ini memiliki alat yang hebat untuk menampilkan secara visual apa yang dilakukan mesin saat menangani ekspresi Anda dan input string.

John Fisher
sumber
1
+1, "Regex Hero" juga menyenangkan: regexhero.net/tester
Angelo
Regexbuddy adalah salah satu alat favorit saya. Melihat tampilan hierarki sangat membantu, karena dapat menguji secara instan saat Anda menghasilkan regex Anda. Saya telah belajar lebih banyak regex tanpa mencoba mempelajarinya hanya dengan menggunakannya.
Chao
1
Saya selalu menganggap RegexBuddy menarik, tetapi saya tidak suka harus membelinya. Untuk pengujian regex dasar, ada banyak utilitas lain. Untuk melihat deskripsi tekstual dari regex meskipun ada lebih sedikit alat. Versi berbayar Regex Hero juga melakukannya. Satu hal yang agak unik bagi RegexBuddy adalah Regex Debugger, yang menunjukkan setiap penerimaan atau penolakan suatu karakter, dan masing-masing backtrack dalam detail yang luar biasa, yang benar-benar dapat membantu ketika debuuging regex yang besar dan sangat rumit. Saya tidak melihat ada alat lain yang melakukan itu.
Kevin Cathcart
3

Ekspresi reguler bisa menjadi sangat rumit dengan sangat cepat, jadi saya sarankan Anda mulai mempelajarinya menggunakan tutorial. Ketahuilah bahwa bentuk ekspresi reguler yang paling sederhana adalah string yang mewakili apa yang Anda cari. Sayangnya, untuk dapat menetapkan aturan pencarian khusus, diperlukan karakter tertentu, dan karakter ini harus diloloskan atau Anda akan membuat ekspresi reguler yang tidak benar atau salah.

Saran saya adalah mulai dengan contoh dari sesuatu yang Anda cari dan hindari. Jadi dengan kata lain, jika Anda mencari apa pun di dalam tanda kurung, ambil contoh satu string seperti itu dalam teks yang Anda cari: (this is an example of something you'd want to find)

Mulailah dengan melarikan diri karakter sehingga Anda mencari karakter literal: \(this is an example of something you'd want to find\)

Uji, verifikasi bahwa ia menemukan contoh Anda dengan benar. Kemudian generalisasikan ekspresi untuk menemukan teks seperti itu, bukan hanya contoh yang Anda temukan. Maka itu akan menjadi: \([^)]*\) (berarti karakter apa pun yang bukan ")" untuk sejumlah kejadian, termasuk 0).

Uji lagi, dan verifikasi bahwa itu tidak hanya menemukan contoh Anda, tetapi orang lain menyukainya. Cari ekspresi reguler yang lebih rumit tetapi lebih sering di internet dan tambal dengan ekspresi reguler yang ada untuk menghindari kekhawatiran tentang setiap kemungkinan.

Itu saja. Dan oh, belajar dan cinta \ Q ... \ E. Dalam sebagian besar bahasa ekspresi reguler, \ Q menunjukkan awal dari pola literal dan \ E menandai akhirnya, jika Anda harus berurusan dengan pencarian pola yang sangat canggih dan tidak tahu bagaimana cara menghindarinya. Itu menyelamatkan hidup saya lebih dari beberapa kali.

Neil
sumber
3

Saya akan memberi Anda jawaban sederhana untuk pertanyaan sederhana. Pertama, Anda perlu memahami apa itu Regular Expressions (RegEx) - apa yang mereka lakukan, untuk apa mereka digunakan. Kemudian, alat yang bagus untuk memulai.

  1. Apa itu? RegEx adalah bahasa untuk mengekspresikan pencocokan pola. Dengan kata lain, menggunakannya, Anda dapat membuat kombinasi karakter yang mengenali, atau menemukan, pola dalam teks. Bagaimana ini berguna? Dalam pemrograman, Anda dapat memberitahu komputer untuk mencocokkan teks dari beberapa sumber (input pengguna, halaman web, dll.) Dan mendeteksi apakah patters teks tertentu terkandung di dalamnya. Misalnya, tanda titik (.) Menunjukkan karakter - huruf atau angka. Angka dalam kurung mewakili angka iterasi, jadi ". {1,30}" menunjukkan karakter apa saja, diulang antara 1 dan 30 kali - dengan kata lain, Anda tidak dapat memiliki string kosong, dan tidak boleh lebih dari 30 karakter. Dan itu berlanjut dari sana.

  2. Bagaimana cara memulai belajar? Alat terbaik mutlak yang saya lihat adalah Expresso , tetapi hanya untuk Windows. Ini memiliki GUI yang sangat luas di mana Anda mengklik elemen yang ingin Anda tambahkan ke ekspresi Anda, kemudian tester untuk memeriksanya terhadap berbagai input untuk melihat hasilnya. Saya belum melihat sesuatu yang bagus di Mac (tapi saya menjalankan Windows di VMWare, jadi tidak benar-benar membutuhkan versi Mac), belum menghabiskan banyak waktu mencari di Linux.

Jay Imerman
sumber
1
Terima kasih atas tipnya tentang Expresso. Saya mencobanya dan itu luar biasa!
Jim In Texas
3

Selain referensi yang baik, cara Anda benar - benar belajar adalah dengan menggunakan alat belajar yang baik. Salah satunya menggunakan editor Vim open-source , dengan dua opsi yang ditetapkan:

  1. : set incsearch ... saat Anda mengetikkan pola pencarian di baris perintah, editor on-the-fly melompat ke bagian pertama dari teks yang cocok dan menyoroti persis apa yang cocok. Jika Anda mengetik sesuatu yang membuatnya tidak lagi cocok dengan apa pun, Vim melompat kursor Anda kembali ke tempat Anda berada saat Anda mulai.
  2. : set hlsearch ... ini memberitahu Vim untuk menampilkan latar belakang yang disorot pada semua teks yang cocok dengan pencarian RE saat ini.

Yang lainnya adalah dengan menggunakan alat panggilan gratis RegExCoach . Anda menempelkan teks yang ingin Anda cari, lalu di jendela lain Anda mengembangkan ekspresi reguler Anda. Seperti Vim, ini menyoroti pertandingan yang sukses dengan cepat.

rev Firstrock
sumber
RegExCoach sekarang adalah shareware. Saya merasa sangat membantu dalam mengembangkan RE-gaya Perl yang kompleks.
Firstrock
2

Anda mulai dengan perbandingan string dasar. Sangat mudah, tetapi juga tidak sekuat itu.

Selanjutnya, mungkin terjadi pada Anda, bahwa Anda memerlukan perbandingan inesitif kasus, sehingga "Yunani" dan "GreeK" sama. Ini sedikit lebih kuat.

Suatu hari Anda melihat perbedaan kecil dalam pengejaan seharusnya tidak mencegah 2 kata dari membandingkan sama: yaitu "mengatur" dan "mengatur" harus membandingkan sama. Anda duduk dan menulis beberapa kode yang melakukan ini dan Anda senang.

Sampai Anda sedikit lebih abstrak dan sadari bahwa Anda terkadang ingin semua kata yang berakhiran "ize" dibandingkan dengan saudara mereka dalam ejaan bahasa Inggris. Atau, pengulangan beberapa string beberapa kali. Dan, tentu saja, Anda perlu menggabungkan semua itu.

Dan seterusnya. Akhirnya, Anda kemungkinan besar berakhir dengan beberapa notasi di mana tidak setiap karakter mewakili dirinya sendiri. Tidak ada yang lain adalah regexp. Orang dapat melihatnya sebagai deskripsi dari serangkaian string.

Dan kemudian, itu cukup mudah dan sampai pada 3 prinsip dasar berikut:

Anda memiliki regexps dasar: karakter yang berdiri sendiri, kelas karakter, singkatan praktis dan tidak begitu berguna untuk kelas karakter seperti \ d atau \ p {Lu} untuk huruf besar.

Dan kemudian, Anda memiliki beberapa kemungkinan untuk menggabungkannya: jika r1 dan r2 adalah regexps, maka begitu pula r1r2 r1 | r2 (r1).

Terakhir, namun tidak sedikit pengubah pengulangan: r? r * r + r {n, m}

Ini yang paling perlu Anda ketahui. Ada lagi yang bisa Anda cari ketika Anda membutuhkannya.

Ingo
sumber
2

Dua jawaban lain yang baik memberitahu Anda untuk mempelajari teori di balik regex, dan untuk berlatih, yang keduanya merupakan saran bagus. Saya juga merekomendasikan mendapatkan alat regex visual yang baik untuk membantu Anda jika Anda serius.

RegexBuddy , misalnya, memiliki mode debug visual yang memungkinkan Anda melangkah melalui eksekusi regex, dan menunjukkan kepada Anda melalui highlight dan teks penjelasan apa yang dilakukan mesin regex pada setiap langkah. Ada video yang menunjukkan debugging ini di situs mereka.

Steven
sumber
2

Segala yang kami dapat berikan kepada Anda adalah lebih banyak sumber untuk dipelajari. Pertanyaan ini sendiri merupakan sumber.

Ngomong-ngomong, saya telah belajar ekspresi reguler dengan cukup mudah dari situs ini: http://www.regular-expressions.info/

Thiago Negri
sumber
1

Bagi saya, melihat apa yang cocok dengan regexp saat saya membangunnya benar-benar membantu membuat hidup saya lebih mudah dan telah membantu saya lebih memahami mereka.

Untuk melakukan ini, saya akan membuka file dengan teks target di Emacs, dan kemudian menggunakan isearch-forward-regexpperintah. Saat Anda memasukkan regexp, Emacs menunjukkan kepada Anda apa yang cocok (itulah bagian "pencarian").

Untuk menjalankan perintah, di Emacs, Anda dapat menggunakan <ESC>xisearch-forward-regexp.

jerny
sumber
1

Saya belajar ekspresi reguler dengan mempelajari flex dan bison, yang digunakan untuk membangun analisis leksikal dan parser. Anda tidak dapat memiliki pengurai tanpa ekspresi reguler, dan buku lexx dan yacc sangat pandai berjalan melalui teori tanpa bergerak terlalu cepat.

Pada dasarnya, hampir semua mesin regex akhir-akhir ini mengikuti prinsip yang sama. Mereka semua mesin negara hingga dan jika Anda benar-benar grok itu, maka Anda memiliki kaki di hampir semua kode yang Anda tulis. Ini mirip dengan mempelajari rekursi dalam hal itu, begitu Anda mendapatkannya, Anda menerapkannya pada masalah secara naluriah. Mereka mudah diselesaikan dengan alat yang tepat, tetapi sangat sulit tanpanya.

Hal lain tentang belajar lexx dan yacc, dibandingkan dengan ekspresi reguler, adalah Anda belajar bagaimana mereka bekerja secara internal. Bagaimana program melihat ke depan, mengapa ia menyelesaikan pertandingan, bagaimana ia menyimpan data, dan banyak lagi. Memahami petunjuk adalah mutlak harus, tetapi jika Anda mendapatkan lexx dan yacc, dan menjalaninya dari awal Anda akan mempelajari semua yang Anda minta, dan memiliki alat yang sangat kuat untuk sisa karir Anda.

Pertanyaan ini mencakup banyak sumber untuk belajar, dan kerangka fleksibel yang saya lempar bersama.

Spencer Rathbun
sumber
1

Lagi, saya pertama kali mencoba memastikan tidak ada cara yang lebih mudah untuk menyelesaikan masalah / "tokenize" string.

Ketika Anda tidak dapat menemukan satu, saya melihatnya sebagai masalah bukan dari mencoba untuk mencocokkan apa yang Anda inginkan dari string, melainkan, masalah TIDAK cocok dengan apa yang tidak Anda inginkan. Ini sebagian besar karena regex serakah. Tetapi itu telah membantu saya dengan baik sebagai pendekatan untuk mendapatkan apa yang saya inginkan.

Ini sebuah contoh:

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

untuk mencocokkan menit:

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

Alih-alih mencoba menemukan waktu bersama dengan yang lain, cobalah untuk menemukan batasan yang berbeda.

Contohnya sedikit dibuat-buat, tapi semua yang bisa saya pikirkan.

frogstarr78
sumber
1

Salah satu pendekatan yang saya gunakan adalah menemukan banyak proyek open source yang membutuhkan pembaruan sintaksis dan kemudian menulis skrip sed yang semakin kompleks, yang terdiri dari banyak ekspresi reguler.

Skrip diperlukan untuk menjalankan berbagai file berbeda di setiap proyek open source. Kemudian jalankan melawan berbagai proyek dengan gaya yang berbeda. Saya mulai dengan sesuatu yang sangat sederhana seperti %s/before/after saat itu saya menemukan bahwa itu cocok dengan banyak kasus. jadi saya menambahkan lebih banyak barang untuk mencegahnya. Kemudian saya menemukan proyek yang berbeda menggunakan gaya sintaks yang berbeda yang membutuhkan perubahan berbeda.

Pada akhirnya saya berakhir dengan

  • keterampilan dan pengetahuan hebat tentang ekspresi reguler
  • keterampilan yang baik dengan sed
  • membantu banyak proyek sumber terbuka
  • mendapatkan banyak aktivitas kontribusi yang ditampilkan di profil github saya
  • alat 'pisau swiss-tentara' yang bagus untuk sabuk alat virtual

dan dibantu dalam pendekatan ini oleh kebutuhan untuk

  • mencapai tujuan aktual tanpa curang
  • gunakan keterampilan (regex) sebagai bagian dari tujuan yang lebih besar dengan motivasi yang lebih besar.
  • dapat menunjukkan bukti keterampilan yang saya pelajari dengan mengubah kode orang lain dan kemudian memeriksa perubahannya.

Saya juga akan menyampaikan bahwa ada banyak situs untuk berbagai bahasa - ruby, javascript, dll. Yang memungkinkan Anda bermain-main dengan ekspresi dan contoh teks untuk kepuasan segera. Ini adalah:

regex dalam berbagai bahasa di satu situs

fokus pada grup pertandingan:

Michael Durrant
sumber
0

Saya telah menemukan belajar ekspresi reguler yang mirip dengan mempelajari tabel perkalian - ya, Anda perlu memahami ide di baliknya, tetapi pada akhirnya, Anda hanya perlu melakukannya berulang kali dan berulang kali.

Ketika saya belajar, saya akan menetapkan tujuan melakukan beberapa latihan regex per hari. Dalam praktiknya, ini berarti setidaknya sekali sehari, saya akan mencoba untuk melihat string atau teks di layar saya, dan muncul dengan tantangan - "bisakah saya mendapatkan semua alamat email dari sini", atau "temukan semua kemunculan kata 'kode' digunakan sebagai kata kerja dan bukan kata benda, "hal-hal seperti itu.

Melakukan itu selama beberapa minggu benar-benar membuahkan hasil - dan tentu saja, ulasan berkala dan penyegar diperlukan. Saya hampir waktunya untuk satu.

Saya menemukan alat online ini juga membantu, karena mari saya uji regex secara real time: http://www.gethifi.com/tools/regex

Philip Schweiger
sumber