[Powered by Google Translate] [Seminar: Corak Pedang dengan Ungkapan Biasa] [John University Mussman-Harvard] [Ini adalah CS50.-CS50.TV] Okay. Well, semua orang dialu-alukan. Ini adalah CS50 2012. Nama saya John, dan saya akan bercakap hari ini mengenai ungkapan-ungkapan yang tetap. Ungkapan biasa terutamanya alat, tetapi juga kadang-kadang digunakan dalam kod aktif pada dasarnya perlawanan corak dan tali. Jadi di sini adalah satu komik web dari xkcd. Dalam komik ini terdapat satu misteri pembunuhan di mana pembunuh mempunyai diikuti orang bercuti, dan pihak yang terbabit perlu mencari melalui 200 megabait e-mel mencari alamat. Dan mereka adalah kira-kira untuk berputus asa apabila seseorang yang tahu ungkapan biasa - mungkin superhero - swoops ke bawah dan menulis beberapa kod dan menyelesaikan misteri pembunuhan itu. Jadi mungkin yang akan menjadi sesuatu yang anda akan diberi kuasa untuk berbuat selepas seminar ini. Kami hanya akan memberikan pengenalan ringkas kepada bahasa dan memberi anda cukup kemampuan untuk pergi selepas lebih banyak sumber sendiri. Jadi ungkapan-ungkapan yang tetap melihat pada dasarnya seperti ini. Ini adalah ungkapan yang biasa dalam Ruby. Ia tidak terlalu berbeza di seluruh bahasa. Kami mempunyai hanya pada garis condong untuk memulakan dan menandakan ungkapan biasa dalam Ruby. Dan ini adalah satu ungkapan biasa untuk mencari dalam e-mel corak alamat. Jadi kita lihat pada bit pertama kelihatan untuk mana-mana watak abjad angka. Ini kerana alamat e-mel sering perlu bermula dengan huruf abjad. Dan kemudian apa-apa sifat khas yang diikuti oleh simbol @. Dan kemudian perkara yang sama untuk nama domain. Dan kemudian di antara 2 dan 4 aksara untuk mencari. Com,. Bersih, dan sebagainya. Jadi adalah satu lagi contoh ungkapan biasa. Jadi ungkapan yang kerap adalah protokol untuk mencari patters dalam teks. Mereka melakukan perbandingan, pilihan, dan penggantian. Jadi contoh ketiga mencari semua nombor-nombor telefon yang berakhir pada 54 di direktori. Jadi sebelum David mengoyak sehingga direktori CS50 kita boleh mencari corak di mana kita mempunyai kurungan maka 3 nombor kemudian berakhir kurungan, 3 lagi nombor, sengkang, 2 nombor, dan kemudian 54. Dan yang akan menjadi asasnya bagaimana kita datang dengan ungkapan biasa untuk mencari itu. Jadi ada - kita telah melakukan beberapa perkara dalam CS50 yang sedikit seperti ungkapan biasa, maka - sebagai contoh - dalam fail dictionary.C untuk periksa ejaan set masalah yang anda mungkin telah digunakan fscanf untuk membaca dalam satu perkataan daripada kamus. Dan anda boleh lihat 45s peratusan sedang mencari rentetan 45 aksara. Jadi ia adalah agak seperti ungkapan biasa asas. Dan anda boleh mempunyai 45 watak-watak yang sesuai dengan rang undang-undang di sana dan memilih mereka sehingga. Dan kemudian contoh kedua paling terkini web masalah pengaturcaraan ditetapkan dalam kod php distro untuk kita sebenarnya mempunyai ungkapan tetap mudah. Dan yang satu ini hanya semata-mata mencari untuk memeriksa jika laman web yang diluluskan pada sepadan login sama ada atau logout mendaftar. PHP. Dan kemudian kembali benar atau palsu berdasarkan yang hampir sama ungkapan biasa. Oleh itu, apabila anda menggunakan ungkapan biasa? Mengapa anda di sini hari ini? Jadi anda tidak mahu menggunakan ungkapan biasa apabila ada sesuatu yang melakukan kerja untuk anda lebih mudah. Jadi XML dan HTML sebenarnya agak sukar untuk menulis ungkapan biasa untuk seperti yang akan kita lihat dalam sedikit. Jadi terdapat parsers khusus untuk bahasa-bahasa tersebut. Anda juga perlu okay dengan kira perdagangan dan ketepatan kerap. Jika anda cuba - jadi kita menyaksikan ungkapan biasa untuk alamat e-mel, tetapi mengatakan anda mahu alamat emel yang tertentu dan secara beransur-ansur ungkapan biasa mungkin menjadi lebih kompleks kerana ia menjadi lebih tepat. Jadi yang akan menjadi satu perdagangan luar. Anda perlu memastikan bahawa anda membuat okay dengan ungkapan biasa. Jika anda tahu apa yang anda sedang mencari ia mungkin lebih masuk akal untuk dimasukkan ke dalam masa dan menulis penghurai yang lebih berkesan. Dan akhirnya terdapat isu sejarah dengan kekerapan ungkapan dan bahasa. Ungkapan biasa sebenarnya lebih berkuasa daripada ungkapan yang tetap setiap mengatakan dalam erti kata yang formal. Jadi, saya tidak mahu pergi terlalu jauh ke dalam teori formal, tetapi kebanyakan bahasa yang kita kod dalam sebenarnya tidak biasa. Dan ini adalah mengapa ungkapan biasa kadang-kadang tidak semua yang dianggap selamat. Jadi, pada asasnya terdapat hierarki Chomsky untuk bahasa, dan ungkapan yang tetap membina menggunakan kesatuan, dinamika, dan operasi bintang Kleene yang kita lihat dalam beberapa minit. Jika anda berminat dalam teori terdapat cukup banyak berlaku di sana di bawah hood. Jadi sejarah ringkas - hanya untuk konteks di sini - set biasa datang pada tahun 1950, dan kemudian kita mempunyai editor mudah yang diperbadankan ungkapan biasa - hanya mencari tali. Grep - yang adalah alat baris arahan - adalah salah satu yang pertama alat yang sangat popular yang menggabungkan ungkapan biasa pada 1960-an. Dalam tahun 80-an, Perl dibina - adalah bahasa pengaturcaraan yang menggabungkan ungkapan biasa yang sangat jelas. Dan kemudian baru-baru ini kita mempunyai ungkapan Perl tetap serasi protokol pada dasarnya dalam bahasa-bahasa lain yang menggunakan banyak sintaks yang sama. Sudah tentu peristiwa yang paling penting adalah pada tahun 2008 di mana terdapat adalah yang pertama Hari Ungkapan Biasa Negara, yang saya percaya adalah 1 Jun jika anda mahu untuk meraikan itu. Teori Sekali lagi, hanya lebih sedikit di sini. Jadi terdapat beberapa cara yang berbeza untuk membina ungkapan biasa. Satu cara mudah adalah untuk membina ungkapan bahawa anda akan berjalan pada tali mentafsir - pada dasarnya membina sebuah mini-program kecil yang akan menganalisis keping rentetan dan lihat, "Oh, adakah ini patut ungkapan biasa atau tidak?" Dan kemudian berjalan itu. Jadi, jika anda mempunyai ungkapan biasa yang sangat kecil, ini mungkin cara yang paling berkesan untuk melakukannya. Dan kemudian jika anda - satu lagi pilihan adalah untuk menjaga membina semula ungkapan seperti anda pergi, dan itu adalah kemungkinan Simulasikan. Dan ini percubaan awal di algoritma ungkapan biasa adalah agak mudah dan agak cepat, tetapi tidak mempunyai banyak fleksibiliti. Untuk berbuat demikian juga beberapa perkara yang kita akan melihat hari ini kita telah terpaksa melakukan ungkapan biasa yang lebih kompleks pelaksanaan yang mungkin lebih perlahan, maka itu adalah sesuatu yang perlu diingati Terdapat juga ungkapan penafian biasa pelbagai serangan yang mengeksploitasi potensi bagi pelaksanaan baru ungkapan biasa untuk menjadi sangat kompleks. Dan dalam banyak erti kata yang sama yang kita lihat dalam serangan buffer overflow, anda mempunyai serangan yang bekerja dengan membuat gelung rekursi yang ditakluki kapasiti ingatan. Dan dengan cara ini Regexen adalah salah satu bentuk jamak rasmi ungkapan biasa oleh analogi kepada lembu dalam Anglo-Saxon. Okay, jadi Perpustakaan Python banyak daripada anda di sini secara peribadi mempunyai Mac, supaya anda benar-benar boleh menarik ini di skrin anda. Ungkapan biasa dibina ke dalam Python. Dan sebagainya Python pramuat pada Mac dan juga boleh didapati secara online di pautan ini. Jadi, jika anda menonton anda boleh berhenti dan pastikan anda mempunyai Python seperti yang kita bermain-main di sini. Terdapat talian manual, jadi jika anda hanya perlu menaip Python ke dalam komputer anda anda akan melihat bahawa versi datang dalam terminal. Jadi saya disediakan pautan kepada pengguna untuk Versi 2 Python serta lembaran menipu. Terdapat Versi 3 Python, tetapi Mac anda tidak semestinya datang dengan pramuat. Jadi tidak terlalu berbeza. Okay, jadi beberapa asas-asas menggunakan ungkapan biasa dalam Python. Jadi di sini saya menggunakan ungkapan yang sangat mudah, jadi saya lakukan Python import semula dan kemudian mengambil keputusan re.search. Dan carian mengambil masa 2 hujah. Yang pertama adalah ungkapan biasa, dan yang kedua adalah teks atau tali anda mahu untuk menganalisis. Dan kemudian saya dicetak result.group itu. Jadi ini adalah 2 fungsi asas kita akan lihat hari ini dalam pembelajaran tentang ungkapan biasa. Jadi hanya mogok ungkapan biasa ini di sini h dan kemudian \ w dan kemudian m jadi \ w hanya menerima apa-apa sifat abjad di sana. Jadi di sini kita mencari "h" dan kemudian yang lain watak abjad dan kemudian m, jadi di sini yang akan sepadan dengan ham dalam, "Abraham Lincoln dan ham sandwich." Ini adalah hasil daripada kumpulan itu. Satu lagi perkara yang kita boleh lakukan ialah menggunakan tali sebelum kami teks dalam Python. Jadi saya rasa saya akan pergi ke hadapan dan tarik yang di sini. Python import semula. Dan jika saya melakukan perkara yang sama - marilah kita mengatakan teks, "Abraham," mari kita zoom - ada kita pergi. Teks, "Abraham makan ham." Okay, dan kemudian menyebabkan = re.search. Dan kemudian ungkapan kita boleh h, dan kemudian saya akan melakukan dot m. Jadi titik hanya mengambil apa-apa sifat yang tidak barisan baru termasuk nombor, tanda-tanda peratus, apa-apa seperti itu. Dan kemudian teks - ledakan - dan kemudian result.group--ya. Jadi yang hanya bagaimana untuk melaksanakan fungsi asas di sini. Jika kita mempunyai cincin teks yang - bahawa teks gila - termasuk mengatakan banyak garis condong kembali dan tali di dalam dan perkara-perkara yang boleh kelihatan seperti urutan melarikan diri, maka kita mungkin mahu menggunakan input teks mentah untuk memastikan bahawa diterima. Dan itu hanya kelihatan seperti itu. Jadi, jika kita sedang mencari setiap daripada mereka di sana kita tidak perlu mencari apa-apa. Tetapi itu adalah bagaimana anda akan melaksanakannya; sebelum rentetan ungkapan biasa anda meletakkan r surat. Okay, jadi marilah kita terus. Baiklah - jadi mari kita lihat beberapa pola yang berulang-ulang di sini. Jadi satu perkara yang anda mahu lakukan adalah mengulangi perkara kerana anda mencari melalui teks. Jadi untuk melakukan diikuti oleh apa-apa bilangan b - anda lakukan ab *. Dan kemudian terdapat beberapa peraturan lain juga. Dan anda boleh melihat semua sehingga ini, saya hanya akan dijalankan melalui beberapa yang paling biasa digunakan orang. Jadi ab + adalah diikuti oleh mana-mana N lebih besar daripada 0 daripada b. ab? adalah diikuti dengan 0 atau 1 b. ab {N} adalah diikuti oleh N b, dan kemudian sebagainya. Jika anda mempunyai 2 nombor dalam pendakap kerinting anda menyatakan pelbagai yang boleh mungkin dipadankan. Oleh itu, kita akan kelihatan lebih di beberapa corak berulang-ulang dalam satu minit. Jadi 2 perkara yang perlu diingat apabila menggunakan corak yang hampir sama alat di sini. Jadi katakan kita mahu melihat hm daripada, "Abraham Lincoln membuat sandwich ham." Jadi saya menukar nama Abraham Lincoln kepada Abraham. Dan sekarang kita mencari apa yang dipulangkan oleh fungsi carian ini, dan ia hanya mengembalikan ham dalam kes ini. Dan ia kerana carian hanya secara semula jadi mengambil barisan paling kiri. Dan semua ungkapan biasa melainkan anda menyatakan sebaliknya akan berbuat demikian. Jika kita mahu mencari semua ada fungsi untuk itu - mencari semua. Jadi yang hanya boleh kelihatan seperti semua = re.findall ('h.m, teks) dan kemudian all.group (). Semua menghasilkan kedua-dua ham dan ham, dalam kes ini kedua-dua tali dalam Abraham setiap ham. Jadi itu adalah pilihan yang lain. Besar. Perkara lain yang perlu diingat adalah bahawa ungkapan biasa mengambil terbesar intuitif. Mari kita lihat contoh ini. Kami melakukan bahawa carian paling kiri di sini, dan kemudian saya cuba carian yang lebih besar menggunakan operator bintang Kleene. Jadi bagi, "Abraham Lincoln membuat sandwich ham," dan saya hanya mendapat kembali m sebagai hasilnya. Sebab kesilapan itu adalah bahawa saya akan dapat mengambil apa-apa bilangan h kerana saya tidak menyatakan apa-apa untuk pergi di antara h dan m. Satu-satunya contoh ada yang mempunyai m - satu-satunya contoh di sana dengan m di dalamnya dan apa-apa bilangan h itu hanya rentetan m. Kemudian saya cuba sekali lagi, saya berkata, "Baiklah, mari kita mendapat sebenar kumpulan terbesar di sini." Dan kemudian saya h. * M, supaya hanya mengembalikan apa-apa bilangan huruf di antara h dan m. Dan jika anda baru bermula dan berfikir, "Oh, okay, dan ini akan mendapatkan saya ham, "ia sebenarnya mengambil segala-galanya daripada h dalam Abraham Lincoln sepanjang jalan sehingga ke akhir ham. Ia adalah tamak, ia melihat h - semua ini teks lain - m, dan itu adalah apa yang diperlukan masuk Ini adalah terutamanya mengerikan - ini adalah ciri-ciri yang kita juga boleh nyatakan kerana ia tidak menjadi tamak menggunakan fungsi-fungsi lain. Tetapi ini adalah sesuatu yang kita perlu ingat terutamanya apabila melihat teks HTML, yang merupakan salah satu sebab-sebab yang ungkapan biasa sukar untuk HTML. Kerana jika anda mempunyai tag HTML terbuka dan kemudian banyak barangan di tengah-tengah dan kemudian beberapa HTML yang lain ditutup tag lama kemudian dalam program ini, anda baru sahaja dimakan banyak kod HTML anda mungkin dengan tidak sengaja. Baiklah - watak-watak jadi lebih istimewa, seperti banyak bahasa lain, kami melarikan diri menggunakan palang itu. Oleh itu, kita boleh menggunakan titik untuk menentukan apa-apa sifat kecuali barisan baru. Kita boleh menggunakan melarikan diri w untuk menentukan apa-apa sifat abjad. Dan dengan melarikan diri analogi d bagi mana-mana integer - watak berangka. Kita boleh menentukan - kita boleh menggunakan kurungan untuk menentukan ungkapan yang berkaitan. Jadi ini akan menerima a, b, atau c. Dan kita juga boleh menentukan atau opsyen untuk sama ada atau b. Sebagai contoh - jika kita mencari pelbagai kemungkinan dalam kurungan kita boleh menggunakan pengendali atau seperti dalam - jadi mari kita kembali kepada contoh ini di sini. Dan sekarang mari kita - marilah kita kembali kepada contoh ini di sini, dan kemudian mengambil ae - jadi ini perlu kembali - Saya rasa ini masih Abraham. Jadi ini - jika kita melakukan semua - besar. Jadi, marilah kita mengemaskini teks di sini. "Abraham makan ham manakala pengetam beliau -. Manakala hemming" Besar. Semua. Besar. Sekarang kita mendapat ham, ham, dan hem. Walaupun hemming - sementara bersenandung kepadanya - sementara bersenandung untuk mengepung dia. Besar. Perkara yang sama. Sekarang semua kembali masih hanya ham, ham, dan mengepung tanpa memilih sehingga pada hum atau dia. Great - jadi apa jika kita mahu melihat sama ada itu - supaya kita boleh juga melakukan dia atau - kita akan kembali kepada itu. Okay - jadi - semua betul - dalam kedudukan anda boleh juga menggunakan tanda sisipan atau tanda dolar untuk menentukan bahawa anda mencari sesuatu yang pada permulaan atau akhir rentetan. Atau permulaan atau akhir perkataan. Itu adalah salah satu cara untuk menggunakan itu. Okay - jadi marilah kita bermain-main dengan blok yang lebih besar sedikit teks. Mari kita katakan baris ini di sini - kenyataan ini di sini. Kuasa ungkapan biasa adalah bahawa mereka boleh menentukan corak bukan hanya ditetapkan watak. Marilah kita membuat - marilah kita panggil blok ini. Kemudian kita akan membaca semua yang masuk Dan kemudian mempunyai - marilah kita membuat semua =, maka apakah beberapa perkara yang kita boleh mencari di sini menguntungkan? Kita boleh mencari telinga bersuara. Tidak sangat menarik. Bagaimana pula itu? Kita akan lihat apa yang berlaku. Saya berikan masalah. Jadi apa-apa beberapa perkara sebelum semula dan semua. Jadi yang perlu kembali segala-galanya dari awal sehingga semua semula mungkin satu atau dua kali. Dan kemudian di sini kita mempunyai kuasa ungkapan biasa adalah bahawa mereka boleh menentukan corak bukan sahaja watak-watak di sini. Jadi semua jalan sehingga semula akhir, ia bermula dengan yang paling kiri dan adalah tamak. Mari kita lihat - apa lagi yang kita boleh mencari. Saya rasa satu perkara jika anda berminat untuk mencari kata ganti nama dia dan dia, anda boleh menyemak untuk s yang sama dengan 0 atau 1 dan ungkapan beliau, dan mungkin tidak akan kembali - oh, saya rasa ia kembali dia kerana kita melihat kuasa, hari itu, di sini. Mari kita cuba menyatakan bahawa ini telah datang pada permulaan sesuatu. Mari kita lihat jika yang jatuh di luar. Oleh itu, kita boleh melakukan lemak, dan di sana kita tidak mendapat apa-apa kerana dia dan dia tidak berlaku dalam frasa ini. Besar. Okay - supaya kembali kepada kucing di sini. Corak begitu kompleks mencederakan otak. Jadi itulah sebabnya kita menggunakan ungkapan biasa untuk mengelakkan isu-isu ini. Jadi di sini adalah beberapa cara lain yang berguna anda boleh bermain-main dengan. Kita melihat carian hari ini, tetapi anda juga boleh menggunakan perlawanan, perpecahan, findall, dan kumpulan. Jadi perkara yang sejuk lain yang anda boleh lakukan dengan ungkapan biasa selain hanya mencari corak mengambil corak dan memegang semua perlawanan - pembolehubah - dan kemudian menggunakan mereka dalam kod anda di kemudian hari. Yang boleh agak membantu. Perkara-perkara lain boleh mengira. Jadi kita boleh mengira bilangan contoh corak ungkapan biasa, dan itu adalah apa yang kita boleh menggunakan kumpulan untuk. Dan kaedah lain juga juga mungkin. Jadi saya hanya mahu bercakap sedikit lebih lanjut mengenai cara-cara lain yang anda boleh menggunakan ungkapan-ungkapan yang tetap. Jadi, satu permohonan yang lebih maju dalam padanan kabur. Jadi, jika anda mencari teks untuk ungkapan, Julius Caesar, dan anda melihat sama ada Gaius Julius Caesar atau nama Julius Caesar dalam bahasa lain, maka anda juga mungkin mahu untuk memberikan beberapa berat kepada nilai. Dan jika ia cukup dekat - jika ia melintasi ambang tertentu - maka anda mahu dapat menerima Julius Caesar. Jadi terdapat beberapa pelaksanaan yang berbeza untuk itu dalam beberapa bahasa-bahasa lain juga. Berikut adalah beberapa alat lain, regex Pal - aplikasi sedikit berguna dalam talian untuk memeriksa jika ungkapan biasa anda terdiri betul. Terdapat juga alat-alat yang berdiri sendiri yang anda boleh menjalankan dari desktop anda seperti Pico Ultra, dan juga buku masakan adil. Jadi, jika anda sedang melakukan satu projek yang melibatkan tan ungkapan biasa ini mungkin tempat untuk pergi di luar skop hari ini. Dan kemudian hanya untuk memberi anda rasa cara biasa ia adalah terdapat grep dalam Unix, Perl mempunyai terbina dalam, dan C ada PCRE untuk C. Dan kemudian semua bahasa-bahasa lain juga mempunyai pakej ungkapan biasa yang beroperasi dengan dasarnya sintaks yang sama kita mendapat rasa hari ini. PHP, Java, Ruby, dan sebagainya. Kod Google Search sebenarnya adalah bernilai menyebut, ia adalah salah satu daripada agak beberapa aplikasi di luar sana yang membolehkan orang ramai untuk mengakses pangkalan data dengan menggunakan ungkapan-ungkapan yang tetap. Jadi, jika anda melihat di Search Kod Google, anda boleh mencari kod jika anda sedang mencari contoh bagaimana fungsi boleh digunakan, anda boleh menggunakan ungkapan biasa untuk mendapati bahawa fungsi yang digunakan dalam pelbagai kes-kes yang berbeza. Anda boleh mencari fwrite, dan kemudian anda boleh mencari bendera menulis atau membaca jika anda mahu satu contoh fwrite digunakan dalam kes itu. Jadi perkara yang sama di sana, dan di sini adalah beberapa rujukan. Ini akan menjadi boleh didapati dalam talian juga, jadi pergi ke hadapan jika anda mahu melihat Python, grep, Perl - anda hanya ingin mendapatkan beberapa inspirasi atau jika anda mahu melihat lebih pada teori di sini adalah beberapa melompat baik di luar tempat. Thank you very much. [CS50.TV]