[Powered by Google Translate] [Seminar: Pola Matching dengan Regular Expressions] [John Mussman-Universitas Harvard] [Ini adalah CS50.-CS50.TV] Oke. Nah, menyambut semua orang. Ini adalah CS50 2012. Nama saya John, dan saya akan berbicara hari ini tentang ekspresi reguler. Kalimat biasa terutama alat, tetapi juga kadang-kadang digunakan dalam kode aktif pada dasarnya mencocokkan pola dan string. Jadi, inilah komik web dari xkcd. Dalam komik ini ada misteri pembunuhan di mana si pembunuh memiliki diikuti seseorang berlibur, dan protagonis harus mencari melalui 200 megabyte email mencari alamat. Dan mereka akan menyerah ketika seseorang yang tahu ekspresi reguler - mungkin superhero - menyapu ke bawah dan menulis beberapa kode dan memecahkan misteri pembunuhan. Jadi mungkin yang akan menjadi sesuatu yang Anda akan diberdayakan untuk melakukan setelah seminar ini. Kami hanya akan memberikan pengenalan ringkas untuk bahasa dan memberi Anda cukup sarana untuk pergi setelah lebih banyak sumber daya pada Anda sendiri. Ekspresi begitu teratur terlihat pada dasarnya seperti ini. Ini adalah ekspresi reguler di Ruby. Hal ini tidak terlalu berbeda di seluruh bahasa. Kami memiliki hanya di garis miring untuk memulai dan menandai ekspresi reguler di Ruby. Dan ini adalah ekspresi reguler untuk mencari pola alamat email. Jadi kita melihat pada bit pertama mencari setiap karakter alfanumerik. Itu karena alamat email sering harus mulai dengan karakter abjad. Dan kemudian ada karakter khusus diikuti dengan simbol @. Dan kemudian hal yang sama untuk nama domain. Dan kemudian antara 2 dan 4 karakter untuk mencari. Com,. Bersih, dan sebagainya. Jadi itu adalah contoh lain dari ekspresi reguler. Ekspresi begitu teratur adalah protokol untuk menemukan patters dalam teks. Mereka melakukan perbandingan, pilihan, dan penggantian. Jadi contoh ketiga adalah menemukan semua nomor telepon berakhir pada 54 dalam sebuah direktori. Jadi sebelum David robekan up direktori CS50 kita bisa mencari pola di mana kita memiliki kurung kemudian 3 angka kemudian berakhir kurung, 3 nomor lagi, dash, 2 nomor, dan kemudian 54. Dan itu akan menjadi dasarnya bagaimana kita datang dengan ekspresi reguler untuk mencari itu. Jadi ada - kami telah melakukan beberapa hal dalam CS50 yang sedikit seperti ekspresi reguler, sehingga - misalnya - dalam file dictionary.C untuk spell check masalah set Anda mungkin telah menggunakan fscanf untuk membaca sebuah kata dari kamus. Dan Anda dapat melihat 45s persentase mencari string 45 karakter. Jadi agak seperti ekspresi reguler dasar. Dan Anda dapat memiliki 45 karakter yang sesuai dengan tagihan di sana dan mengambil mereka. Dan kemudian contoh kedua dalam masalah pemrograman web terbaru diatur dalam distro kode untuk php kita sebenarnya memiliki ekspresi reguler sederhana. Dan yang satu ini hanya hanya ingin memeriksa apakah halaman web yang disahkan pada cocok baik masuk atau keluar dari daftar. PHP. Dan kemudian kembali benar atau salah didasarkan pada pencocokan ekspresi reguler. Jadi, ketika Anda menggunakan ekspresi reguler? Mengapa kau di sini hari ini? Jadi Anda tidak ingin menggunakan ekspresi reguler ketika ada sesuatu yang melakukan pekerjaan untuk Anda lebih mudah. Jadi XML dan HTML sebenarnya cukup rumit untuk menulis ekspresi reguler untuk seperti yang kita akan lihat dalam sedikit. Jadi ada parser khusus untuk bahasa-bahasa tersebut. Anda juga harus baik-baik saja dengan perdagangan off dan akurasi sering. Jika Anda mencoba - sehingga kita melihat ekspresi reguler untuk alamat email, tapi katakan Anda ingin alamat email tertentu dan secara bertahap ekspresi reguler mungkin menjadi lebih kompleks karena menjadi lebih tepat. Sehingga akan menjadi salah satu trade off. Anda harus yakin bahwa Anda baik-baik saja membuat dengan ekspresi reguler. Jika Anda tahu persis apa yang Anda cari untuk itu mungkin lebih masuk akal untuk dimasukkan ke dalam waktu dan menulis parser lebih efektif. Dan akhirnya ada masalah sejarah dengan keteraturan ekspresi dan bahasa. Kalimat biasa sebenarnya jauh lebih kuat daripada ekspresi reguler per mengatakan dalam arti formal. Jadi saya tidak ingin pergi terlalu jauh ke dalam teori formal, tapi kebanyakan bahasa yang kita kode sebenarnya tidak teratur. Dan inilah mengapa kalimat biasa terkadang tidak dianggap semua yang aman. Jadi pada dasarnya ada hirarki Chomsky untuk bahasa, dan ekspresi reguler yang membangun menggunakan serikat, Rangkaian, dan operasi tanda star bahwa kita akan melihat dalam beberapa menit. Jika Anda tertarik dalam teori ada cukup banyak terjadi di sana di bawah tenda. Jadi sejarah singkat - hanya untuk konteks di sini - set biasa datang pada tahun 1950, dan kemudian kami memiliki editor sederhana yang dimasukkan ekspresi reguler - hanya mencari string. Grep - yang merupakan alat baris perintah - adalah salah satu yang pertama alat yang sangat populer yang menggabungkan ekspresi reguler pada tahun 1960. Di era 80-an, Perl dibangun - adalah bahasa pemrograman yang menggabungkan ekspresi reguler sangat mencolok. Dan kemudian baru-baru kami telah Perl ekspresi reguler yang kompatibel protokol pada dasarnya dalam bahasa lain yang menggunakan banyak sintaks yang sama. Tentu saja acara yang paling penting adalah pada tahun 2008 mana ada pertama Nasional Regular Expressions Day, yang saya percaya adalah 1 Juni jika Anda ingin merayakan itu. Sekali lagi, hanya sedikit lebih teori sini. Jadi ada beberapa cara yang berbeda beberapa membangun ekspresi reguler. Salah satu cara sederhana adalah untuk membangun ekspresi yang Anda akan berjalan di string menafsirkan - pada dasarnya membangun mini-program kecil yang akan menganalisis potongan string dan melihat, "Oh, apakah ini cocok dengan ekspresi reguler atau tidak?" Dan kemudian jalankan itu. Jadi jika Anda memiliki ekspresi reguler yang sangat kecil, ini mungkin cara yang paling efisien untuk melakukannya. Dan kemudian jika Anda - pilihan lain adalah untuk menjaga merekonstruksi ekspresi saat Anda pergi, dan itu adalah kemungkinan simulasi. Dan upaya awal pada algoritma ekspresi reguler yang relatif sederhana dan relatif cepat, tetapi tidak memiliki banyak fleksibilitas. Jadi untuk melakukan bahkan beberapa hal yang kita akan melihat hari ini kita harus melakukan ekspresi reguler lebih kompleks implementasi yang berpotensi jauh lebih lambat, maka itu adalah sesuatu yang perlu diingat Ada juga ekspresi penolakan reguler berbagai serangan yang mengeksploitasi potensi ini implementasi baru dari ekspresi reguler menjadi sangat kompleks. Dan dalam banyak arti yang sama yang kita lihat dalam serangan buffer overflow, Anda memiliki serangan yang bekerja dengan membuat loop rekursif yang menyerbu kapasitas memori. Dan omong-omong Regexen adalah salah satu bentuk jamak resmi ekspresi reguler dengan analogi lembu di Anglo-Saxon. Oke, jadi Perpustakaan Python banyak dari Anda di sini secara pribadi memiliki Mac, sehingga Anda dapat benar-benar menarik ini di layar Anda. Ekspresi reguler dibangun ke Python. Dan Python telah dimuat pada Mac dan juga tersedia secara online di link ini. Jadi jika Anda menonton Anda dapat menghentikan sebentar dan pastikan Anda memiliki Python karena kami bermain-main di sini. Ada online manual, jadi jika Anda hanya ketik Python ke dalam komputer Anda Anda akan melihat bahwa versi muncul di terminal. Jadi saya memberikan link ke manual untuk Versi 2 dari Python serta contekan. Ada Versi 3 dari Python, tapi Mac Anda tidak selalu datang dengan yang dimuat. Jadi tidak terlalu berbeda. Oke, sehingga beberapa dasar-dasar menggunakan ekspresi reguler di Python. Jadi di sini saya menggunakan ekspresi yang sangat sederhana, jadi saya melakukan Python import re dan kemudian mengambil hasil re.search. Dan pencarian memakan waktu 2 argumen. Yang pertama adalah ekspresi reguler, dan yang kedua adalah teks atau string yang Anda ingin menganalisis. Dan kemudian saya dicetak result.group tersebut. Jadi ini adalah 2 fungsi dasar kita akan lihat hari ini dalam belajar tentang ekspresi reguler. Jadi hanya mogok ini ekspresi reguler di sini jam dan kemudian \ w dan kemudian m sehingga \ w hanya menerima setiap karakter abjad di sana. Jadi di sini kita mencari "h" dan kemudian karakter alfabet lain dan kemudian m, jadi di sini yang akan cocok ham dalam, "Abraham Lincoln dan ham sandwich." Ini adalah hasil dari kelompok itu. Hal lain yang bisa kita lakukan adalah menggunakan string sebelum kami teks dalam Python. Jadi kurasa aku akan pergi ke depan dan menarik bahwa di sini. Python impor kembali. Dan jika saya melakukan hal yang sama - katakanlah teks, "Abraham," mari kita memperbesar - di sana kita pergi. Teks, "Abraham makan ham." Oke, dan kemudian menghasilkan = re.search. Dan kemudian ekspresi kita dapat h, dan kemudian saya akan melakukan dot m. Jadi dot hanya membutuhkan setiap karakter yang bukan baris baru termasuk nomor, tanda persentase, sesuatu seperti itu. Dan kemudian teks - booming - dan kemudian result.group--ya. Jadi itu hanya bagaimana untuk melaksanakan fungsi dasar di sini. Jika kita memiliki sebuah cincin teks yang - bahwa teks gila - termasuk mengatakan banyak garis miring kembali dan string dalam dan hal-hal yang bisa terlihat seperti escape sequence, maka kita mungkin ingin menggunakan input teks baku untuk memastikan yang diterima. Dan itu hanya terlihat seperti itu. Jadi jika kita sedang mencari masing-masing di sana kita tidak akan menemukan apa-apa. Tapi itu adalah bagaimana Anda akan menerapkannya, sebelum string ekspresi reguler Anda meletakkan surat r. Oke, jadi mari kita terus berjalan. Baiklah - jadi mari kita lihat beberapa pola berulang di sini. Jadi satu hal yang ingin Anda lakukan adalah mengulangi hal-hal karena Anda mencari melalui teks. Jadi untuk melakukan diikuti oleh sejumlah b - Anda lakukan ab *. Dan kemudian ada serangkaian aturan lain juga. Dan Anda dapat melihat semua up ini, saya hanya akan berjalan melalui beberapa yang paling umum digunakan orang. Jadi ab + adalah diikuti oleh N lebih besar dari 0 b. ab? adalah diikuti oleh 0 atau 1 b. ab {N} adalah diikuti oleh N b, dan kemudian seterusnya. Jika Anda memiliki 2 nomor dalam kurung kurawal Anda menentukan kisaran yang dapat mungkin cocok. Jadi kita akan melihat lebih di beberapa pola berulang dalam satu menit. Jadi 2 hal yang perlu diingat ketika menggunakan alat pencocokan sini pola ini. Jadi katakan kita ingin melihat dari hm, "Abraham Lincoln membuat ham sandwich." Jadi saya mengubah nama Abraham Lincoln kepada Abraham. Dan sekarang kami sedang mencari apa yang dikembalikan oleh fungsi pencarian ini, dan hanya mengembalikan ham dalam kasus ini. Dan tidak itu karena pencarian hanya secara alami membutuhkan waktu yang paling antrian kiri. Dan semua ekspresi reguler kecuali jika Anda menentukan sebaliknya akan melakukan itu. Jika kita ingin menemukan semua ada fungsi untuk itu - menemukan semua. Sehingga bisa terlihat seperti semua = re.findall ('h.m', teks) dan kemudian all.group (). Semua memproduksi baik ham dan ham, dalam hal ini kedua string di setiap Abraham ham. Sehingga adalah pilihan lain. Besar. Hal lain yang perlu diingat adalah bahwa ekspresi reguler mengambil terbesar intuitif. Mari kita lihat contoh ini. Kami melakukan itu sebagian besar pencari kiri di sini, dan kemudian aku mencoba pencarian yang lebih besar menggunakan operator tanda star. Jadi untuk, "Abraham Lincoln membuat ham sandwich," dan aku hanya kembali m sebagai hasilnya. Alasan untuk kesalahan itu adalah bahwa saya bisa mengambil sejumlah h karena saya tidak menentukan apa-apa untuk pergi di antara h dan m. Satu-satunya Misalnya ada yang memiliki m - satu-satunya contoh di sana dengan m di dalamnya dan sejumlah h itu hanya m tali. Kemudian saya mencoba lagi, saya berkata, "Oke, mari kita mendapatkan kelompok terbesar yang sebenarnya di sini." Dan kemudian aku h. * M, sehingga hanya mengembalikan jumlah karakter antara h dan m. Dan jika Anda baru mulai keluar dan berpikir, "Oh, oke, baik ini akan get me ham, "itu benar-benar mengambil segala sesuatu dari jam dalam Abraham Lincoln sepanjang jalan sampai ke ujung ham. Hal ini serakah, ia melihat h - semua ini teks lain - m, dan itulah yang dibutuhkan masuk Ini adalah sangat mengerikan - ini adalah fitur kami juga bisa tentukan untuk tidak menjadi serakah menggunakan fungsi lain. Tapi ini adalah sesuatu yang kita harus diingat terutama ketika melihat teks HTML, yang merupakan salah satu alasan bahwa ekspresi reguler sulit untuk HTML. Karena jika Anda memiliki tag HTML terbuka dan kemudian banyak hal di tengah dan kemudian beberapa lainnya ditutup HTML tag lama kemudian dalam program ini, Anda baru saja dimakan banyak kode HTML Anda mungkin secara tidak sengaja. Baiklah - karakter sehingga lebih khusus, seperti banyak bahasa lainnya, kami melarikan diri menggunakan garis miring. Jadi kita dapat menggunakan dot untuk menentukan karakter apapun kecuali untuk baris baru. Kita dapat menggunakan escape w untuk menentukan setiap karakter alfabet. Dan dengan analogi melarikan diri d untuk setiap bilangan bulat - karakter numerik. Kita dapat menentukan - kita dapat menggunakan tanda kurung untuk menentukan ekspresi terkait. Jadi ini akan menerima a, b, atau c. Dan kita juga dapat menentukan atau pilihan untuk baik atau b. Misalnya - jika kita sedang mencari beberapa kemungkinan dalam kurung kita bisa menggunakan operator atau seperti dalam - jadi mari kita kembali ke contoh ini di sini. Dan sekarang mari kita - mari kita kembali ke contoh ini di sini, dan kemudian mengambil ae - jadi ini harus kembali - saya kira ini masih Abraham. Jadi ini - jika kita melakukan semua - besar. Jadi mari kita memperbarui teks di sini. "Abraham makan ham sementara hemming nya -. Sementara hemming" Besar. Semua. Besar. Sekarang kita mendapatkan ham, ham, dan hem. Sementara hemming - selagi bersenandung kepadanya - saat bersenandung untuk hem dia. Besar. Sama saja. Sekarang semua kembali masih hanya ham, ham, dan hem tanpa memilih di dengung atau si dia. Besar - jadi apa jika kita ingin melihat baik itu - sehingga kita bisa juga melakukan dia atau - kita akan datang kembali untuk itu. Oke - jadi - baik-baik saja - dalam posisi Anda juga dapat menggunakan tanda sisipan atau tanda dolar untuk menentukan bahwa Anda sedang mencari sesuatu di awal atau akhir dari string. Atau awal atau akhir dari sebuah kata. Itulah salah satu cara untuk menggunakan itu. Oke - jadi mari kita bermain-main dengan blok sedikit lebih besar dari teks. Mari kita katakan baris ini di sini - pernyataan ini di sini. Kekuatan ekspresi reguler adalah bahwa mereka dapat menentukan pola bukan hanya tetap karakter. Mari kita membuat - mari kita menyebutnya blok ini. Kemudian kita akan membaca semua itu masuk Dan kemudian memiliki - mari kita membuat semua =, jadi apa adalah beberapa hal yang kita bisa mencari di sini menguntungkan? Kita bisa mencari telinga berekspresi. Tidak sangat menarik. Bagaimana tentang itu? Kita akan lihat apa yang terjadi. Aku memberinya masalah. Jadi banyak hal sebelum kembali dan semua. Jadi yang harus kembali semuanya dari awal sampai semua kembali mungkin beberapa kali. Dan maka di sini kita memiliki kekuatan ekspresi reguler adalah bahwa mereka dapat menentukan pola bukan hanya karakter di sini. Jadi sepanjang jalan sampai ke kembali akhir, dimulai dengan yang paling kiri dan serakah. Mari kita lihat - apa lagi yang bisa kita cari. Saya kira satu hal jika Anda tertarik untuk mencari kata ganti dia dan dia, Anda bisa memeriksa s yang sama dengan 0 atau 1 dan ekspresi dia, dan itu mungkin tidak akan kembali - oh, saya kira itu kembali ia karena kita melihat kekuatan, hari itu, di sini. Mari kita mencoba menentukan bahwa ini harus datang pada awal dari sesuatu. Mari kita lihat apakah itu menurun. Jadi kita bisa melakukan lemak, dan di sana kami tidak mendapatkan apa-apa karena dia dan dia tidak terjadi dalam kalimat ini. Besar. Oke - jadi kembali ke kucing di sini. Jadi pola kompleks menyakiti otak. Jadi itulah sebabnya kami menggunakan ekspresi reguler untuk menghindari masalah ini. Jadi di sini adalah beberapa mode lain yang berguna Anda dapat bermain-main dengan. Kami melihat pencarian hari ini, tetapi Anda juga dapat menggunakan pertandingan, split, findAll, dan kelompok. Jadi hal keren lain yang dapat Anda lakukan dengan ekspresi reguler selain hanya mencari pola adalah mengambil pola dan memegang semua pertandingan - variabel - dan kemudian menggunakan mereka dalam kode Anda di kemudian hari. Itu bisa sangat membantu. Hal-hal lain mungkin menghitung. Jadi kita bisa menghitung jumlah contoh pola ekspresi reguler, dan itulah yang dapat kita gunakan untuk kelompok. Dan mode lain juga juga mungkin. Jadi saya hanya ingin berbicara sedikit lebih banyak tentang cara-cara lain Anda dapat menggunakan ekspresi reguler. Jadi satu aplikasi yang lebih maju dalam pencocokan fuzzy. Jadi jika Anda mencari teks untuk ekspresi, Julius Caesar, dan Anda melihat baik Gaius Julius Caesar atau nama Julius Caesar dalam bahasa lain, maka Anda juga mungkin ingin menetapkan beberapa berat terhadap nilai-nilai. Dan jika itu cukup dekat - jika melintasi batas tertentu - maka Anda ingin untuk dapat menerima Julius Caesar. Jadi ada beberapa implementasi yang berbeda untuk itu dalam beberapa bahasa lainnya juga. Berikut adalah beberapa alat lainnya, Regex Pal - sebuah aplikasi kecil yang berguna online untuk memeriksa apakah ekspresi reguler Anda terdiri dengan benar. Ada juga alat mandiri yang dapat dijalankan dari desktop Anda seperti Ultra Pico, dan serta buku masak adil. Jadi jika Anda melakukan sebuah proyek yang melibatkan satu ton ekspresi reguler ini mungkin adalah tempat untuk pergi di luar lingkup hari ini. Dan kemudian hanya untuk memberikan rasa bagaimana umum itu ada grep di Unix, Perl memiliki built-in, dan C ada PCRE untuk C. Dan kemudian semua bahasa lain juga memiliki paket ekspresi reguler yang beroperasi dengan dasarnya sintaks yang sama kami mendapat rasa hari ini. PHP, Java, Ruby, dan sebagainya. Google Code Search sebenarnya layak disebut, ini adalah salah satu relatif sedikit aplikasi di luar sana yang memungkinkan masyarakat untuk mengakses database-nya menggunakan ekspresi reguler. Jadi jika Anda melihat di Google Code Search Anda dapat menemukan kode jika Anda mencari sebuah contoh bagaimana fungsi dapat digunakan, Anda dapat menggunakan ekspresi reguler untuk menemukan bahwa fungsi yang digunakan dalam segala macam kasus yang berbeda. Anda bisa mencari fwrite, dan kemudian Anda bisa mencari bendera menulis atau membaca jika Anda ingin contoh fwrite yang digunakan dalam kasus itu. Jadi hal yang sama di sana, dan ini adalah beberapa referensi. Ini akan tersedia secara online juga, jadi akan maju jika Anda ingin melihat Python, grep, Perl - Anda hanya ingin mendapatkan beberapa inspirasi atau jika Anda ingin melihat lebih pada teori berikut adalah beberapa melompat yang baik off tempat. Terima kasih banyak. [CS50.TV]