Laman » bagaimana untuk » Bagaimana Menggunakan Ekspresi Biasa Asas untuk Cari Lebih Baik dan Menjimatkan Masa

    Bagaimana Menggunakan Ekspresi Biasa Asas untuk Cari Lebih Baik dan Menjimatkan Masa

    Sama ada anda telah mencari dengan Grep atau melihat program yang boleh mengubah nama fail untuk anda, anda mungkin tertanya-tanya jika ada cara yang lebih mudah untuk menyelesaikan tugas anda. Syukurlah, ada, dan ia dipanggil "ungkapan biasa."

    (Komik dari XKCD.com)

    Apakah Ekspresi Biasa??

    Ungkapan yang kerap adalah kenyataan diformat dengan cara yang sangat spesifik dan yang dapat berdiri untuk banyak hasil yang berbeda. Juga dikenali sebagai "regex" atau "regexp," mereka digunakan terutamanya dalam fungsi penamaan dan penamaan fail. Satu regex boleh digunakan seperti formula untuk membuat beberapa output yang mungkin berbeza, semuanya dicari. Sebagai alternatif, anda boleh menentukan bagaimana kumpulan fail harus dinamakan dengan menentukan regex, dan perisian anda secara berperingkat boleh bergerak ke output yang dimaksudkan seterusnya. Dengan cara ini, anda boleh menamakan semula beberapa fail dalam pelbagai folder dengan sangat mudah dan cekap, dan anda boleh bergerak melampaui batasan sistem penomboran mudah.

    Kerana penggunaan ungkapan biasa bergantung pada sintaks khas, program anda mesti mampu membaca dan menguraikannya. Banyak program penamaan fail kumpulan untuk Windows dan OS X mempunyai sokongan untuk regexps, serta alat carian rentas platform GREP (yang kami sentuh dalam Bash Scripting untuk Panduan Pemula) dan alat baris arahan Awk untuk * Nix. Di samping itu, banyak pengurus fail alternatif, pelancar, dan alat carian menggunakannya, dan mereka mempunyai tempat yang sangat penting dalam bahasa pengaturcaraan seperti Perl dan Ruby. Persekitaran pembangunan lain seperti .NET, Java, dan Python, serta C ++ 11 yang akan datang, semuanya menyediakan perpustakaan standard untuk menggunakan ungkapan biasa. Seperti yang anda bayangkan, mereka boleh menjadi sangat berguna apabila cuba meminimumkan jumlah kod yang anda masukkan ke dalam program.

    Nota Mengenai Melepaskan Watak

    Sebelum kami menunjukkan kepada anda contoh, kami ingin menunjukkan sesuatu. Kami akan menggunakan shell bash dan perintah grep untuk menunjukkan kepada anda cara menerapkan ungkapan biasa. Masalahnya ialah kadang-kadang kita mahu menggunakan watak-watak khas yang perlu diserahkan kepada grep, dan shell bash akan menafsirkan watak itu kerana menggunakannya juga. Dalam keadaan ini, kita perlu "melarikan diri" watak-watak ini. Ini dapat mengelirukan kerana "melarikan diri" watak-watak juga berlaku di dalam regexps. Sebagai contoh, jika kita mahu memasukkannya ke dalam grep:

    \<

    kita perlu menggantikannya dengan:

    \\\<

    Setiap watak istimewa di sini mendapat satu backslash. Sebagai alternatif, anda juga boleh menggunakan sebut harga tunggal:

    '\<'

    Petikan tunggal memberitahu bash TIDAK untuk mentafsirkan apa yang ada di dalamnya. Walaupun kami memerlukan langkah-langkah ini supaya kami dapat menunjukkan untuk anda, program anda (terutama yang berasaskan GUI) sering tidak memerlukan langkah tambahan ini. Untuk menjaga perkara yang mudah dan mudah, ungkapan biasa yang sebenar akan diberikan kepada anda seperti teks yang dipetik, dan anda akan melihat sintaks yang terselamat dalam tangkapan skrin arahan.

    Bagaimana Mereka Memperluas?

    Regexps adalah cara ringkas yang menyatakan istilah supaya komputer anda dapat mengembangkannya menjadi beberapa pilihan. Mari lihat contoh berikut:

    tom [0123456789]

    Kurungan segiempat sama - [dan] - memberitahu enjin parsing bahawa apa sahaja yang ada di dalamnya, mana-mana SATU aksara boleh digunakan untuk dipadankan. Apa yang ada di dalam kurungan itu dipanggil set aksara.

    Oleh itu, jika kami mempunyai senarai besar entri dan kami menggunakan regex ini untuk mencari, istilah berikut akan dipadankan:

    • tom
    • tom0
    • tom1
    • tom2
    • tom3

    dan sebagainya. Walau bagaimanapun, senarai berikut TIDAK akan dipadankan, dan TIDAK akan muncul dalam hasil anda:

    • tomato; regex tidak menyumbang sebarang huruf selepas "tom"
    • Tom; regex adalah sensitif kes!

    Anda juga boleh memilih untuk mencari dengan tempoh (.) Yang akan membolehkan mana-mana watak hadir, selagi ada watak yang hadir.

    Seperti yang anda boleh lihat, grepping with

    .tom

    tidak memaparkan istilah yang hanya mempunyai "tom" pada permulaannya. Walaupun "tomato hijau" masuk, kerana ruang sebelum "tom" dikira sebagai watak, tetapi istilah seperti "tomF" tidak mempunyai watak pada mulanya dan dengan itu diabaikan.

    Nota: Kelakuan lalai Grep adalah untuk mengembalikan keseluruhan baris teks apabila sebahagian bahagian sepadan dengan regex anda. Program lain mungkin tidak melakukan ini, dan anda boleh mematikannya dengan grego '-o'.

    Anda juga boleh menentukan alternation menggunakan paip (|), seperti di sini:

    speciali (s | z) e

    Ini akan mendapati kedua-dua:

    • pengkhususan
    • pengkhususan

    Apabila menggunakan perintah grep, kita perlu melarikan diri dari aksara khas (, |, dan) dengan backslashes serta menggunakan bendera '-E' untuk mendapatkan ini untuk berfungsi dan mengelakkan ralat hodoh.

    Seperti yang kita nyatakan di atas, ini adalah kerana kita perlu memberitahu shell bash untuk lulus aksara ini untuk grep dan tidak melakukan apa-apa dengan mereka. Bendera '-E' memberitahu grep untuk menggunakan kurungan dan paip sebagai aksara khas.

    Anda boleh mencari dengan pengecualian menggunakan karet yang berada di dalam kurungan persegi dan pada permulaan set:

    tom [^ f | 0-9]

    Sekali lagi, jika anda menggunakan grep dan bash, ingatlah untuk melepaskan paip itu!

    Terma yang ada dalam senarai tetapi TIDAK muncul adalah:

    • tom0
    • tom5
    • tom9
    • tomF

    Ini tidak sepadan dengan regex kami.

    Bagaimana saya boleh menggunakan Persekitaran?

    Selalunya, kami mencari berdasarkan sempadan. Kadang-kadang kita hanya mahu rentetan yang muncul pada awal perkataan, di akhir kata, atau di akhir baris kod. Ini boleh dilakukan dengan mudah menggunakan apa yang kita sebut sauh.

    Menggunakan karet (di luar kurungan) membolehkan anda menunjuk "permulaan" garisan.

    ^ tom

    Untuk mencari akhir baris, gunakan tanda dolar.

    tom $

    Anda dapat melihat bahawa rentetan carian kami datang SEBELUM utama dalam kes ini.

    Anda juga boleh untuk perlawanan yang muncul pada awal atau akhir perkataan, bukan garis penuh.

    \

    tom \>

    Seperti yang kita nyatakan dalam nota pada permulaan artikel ini, kita perlu melepaskan watak-watak istimewa ini kerana kita menggunakan bash. Sebagai alternatif, anda juga boleh menggunakan sebut harga tunggal:

    Hasilnya adalah sama. Pastikan anda menggunakan sebut harga tunggal, dan bukan sebut harga berganda.

    Sumber Lain Untuk Regexps Lanjutan

    Kami hanya melanda hujung gunung es di sini. Anda juga boleh mencari istilah wang yang digambarkan oleh penanda mata wang, dan mencari salah satu dari tiga atau lebih istilah yang sepadan. Perkara boleh menjadi sangat rumit. Sekiranya anda berminat untuk mempelajari lebih lanjut mengenai ungkapan biasa, sila lihat sumber berikut.

    • Zytrax.com mempunyai beberapa halaman dengan contoh-contoh tertentu mengapa perkara dilakukan dan tidak sepadan.
    • Regular-Expressions.info juga mempunyai panduan pembunuh untuk banyak perkara yang lebih maju, serta halaman rujukan yang berguna.
    • Gnu.org mempunyai laman yang didedikasikan untuk menggunakan regexps dengan grep.

    Anda juga boleh membina dan menguji ungkapan biasa anda menggunakan alat dalam talian berasaskan Flash percuma yang disebut RegExr. Ia berfungsi semasa anda menaip, adalah percuma, dan boleh digunakan dalam kebanyakan penyemak imbas.


    Adakah anda mempunyai kegunaan kegemaran untuk ungkapan biasa? Ketahui tentang renamer batch yang hebat yang menggunakannya? Mungkin anda hanya mahu bercakap tentang grep-fu anda. Sumbang fikiran anda dengan memberi komen!