Mulakan dengan Regex: Ekspresi Biasa Permudah

Pendedahan: Sokongan anda membantu mengekalkan laman web ini! Kami memperoleh bayaran rujukan untuk beberapa perkhidmatan yang kami cadangkan di halaman ini.


Ungkapan biasa, regex atau regexp pendek, adalah urutan huruf dan simbol yang menentukan corak logik. Rentetan teks kemudian dapat dibandingkan dengan pola untuk mengenal pasti rentetan yang sesuai dengan corak logik yang ditentukan oleh regex. Berdasarkan perbandingan ini, regex dapat digunakan untuk mengenal pasti rentetan teks yang memenuhi syarat tertentu atau untuk mengesahkan bahawa string memenuhi pola yang diperlukan.

Sekiranya penjelasan mengenai regex ini kelihatan agak abstrak, mungkin melihat beberapa kegunaan umum regex akan membantu menjelaskan kegunaannya. Regex digunakan sepanjang masa dalam pengaturcaraan komputer. Sebagai contoh, berikut adalah beberapa kegunaan umum untuk regex:

  • Untuk mengesahkan bahawa alamat e-mel yang dimasukkan ke dalam borang web adalah alamat e-mel yang diformulasikan dengan betul.
  • Untuk mengenal pasti semua fail dalam sistem komputer yang diakhiri dengan peluasan fail tertentu.
  • Untuk memeriksa URL yang diminta dari pelayan web dan melakukan pengalihan jika URL memenuhi corak regex.

Penting untuk memahami bahawa regex adalah sistem logik untuk menerangkan corak dan bukan bahasa. Namun, regex telah dilaksanakan dalam banyak bahasa pengaturcaraan yang berbeda dan juga dapat digunakan untuk mencari teks di banyak editor teks.

Sejarah Regex

Regex dikandung sebagai teori sains komputer teori ketika diciptakan pada tahun 1956 oleh ahli matematik Stephen Cole Kleene. Pada mulanya, regex adalah teori semata-mata. Namun, pada tahun 1968 ia digunakan dalam aplikasi komputer untuk pertama kalinya ketika Ken Thompson memasukkannya ke dalam editor teks QED. Thompson tidak sendirian dalam penggunaan regex. Pada masa yang sama, Douglas T Ross menggabungkan regex untuk analisis leksikal dalam penyusun.

Pelaksanaan regex pertama ini segera diikuti. Pada awal 1970-an, corak logik regex ditambahkan ke editor teks Unix, ed. Tidak lama selepas itu, penghurai regex yang dibina di dalam ed dilancarkan sebagai utiliti Unix mandiri yang disebut grep. Pada ketika itu, hanya masalah masa sebelum sokongan regex dimasukkan ke dalam banyak utiliti dan aplikasi Unix termasuk vi, lex, sed, Awk, expr, Emacs, dan banyak lagi.

Pada masa regex telah memasuki jalan ke pelbagai sudut sistem operasi Unix, ia telah diusahakan. Namun, masih ada ruang untuk diperbaiki. Jadi sintaks regex asli yang dikembangkan oleh Kleene diperbaiki pada tahun 1980-an ketika sokongan untuk corak regex diperluas ditambahkan ke Perl berdasarkan perpustakaan regex diperluas yang ditulis oleh Henry Spencer. Walau bagaimanapun, walaupun setelah penambahan regex ke Perl Spencer terus berkembang idea dan iterasi perpustakaannya yang kemudian dan lebih maju dimasukkan ke dalam bahasa pengaturcaraan Tcl – dan pelaksanaan itu akhirnya masuk ke dalam projek pengurusan maklumat moden yang berprofil tinggi seperti PostgreSQL.

Sepanjang tahun 1980-an, regex tidak pernah diseragamkan. Namun, itu berubah pada tahun 1992 apabila regex diseragamkan dalam POSIX.2. Hari ini, regex disokong oleh banyak bahasa pengaturcaraan dan editor teks yang berbeza. Sebilangan besar pelaksanaan moden mematuhi POSIX tetapi secara amnya berkembang pada standard POSIX dengan pelbagai cara yang berbeza dari satu pelaksanaan ke yang berikutnya. Akibatnya, sementara pola regex dasar umumnya cocok dari satu implementasi ke yang berikutnya, pola maju dapat sangat bervariasi bergantung pada lingkungan di mana mereka diterapkan.

Bagaimana Regex Berfungsi

Ungkapan biasa adalah gabungan dua jenis watak: literal dan watak khas. Secara gabungan, watak-watak ini menentukan corak logik. Rentetan teks dapat dibandingkan dengan corak ini untuk melihat apakah sesuai dengan corak yang ditentukan oleh ungkapan.

Watak literal mewakili diri mereka sendiri. Ini bermaksud bahawa huruf harfiah a mewakili huruf a dan angka harfiah 1 mewakili digit 1. Namun, regex tidak begitu berharga jika terbatas pada huruf harfiah. Watak khas adalah yang menjadikan regex berguna.

Watak khas mempunyai makna logik dalam corak regex. Contohnya, mari kita lihat titik. Titik, atau titik, digunakan untuk mewakili watak apa pun. Jadi, .a akan sepadan dengan urutan dua watak di mana watak kedua adalah huruf harfiah a. Itu bermaksud bahawa huruf ba, 1a, -a, aa, dan huruf yang didahului dengan ruang kosong semuanya akan sesuai dengan corak regex.

Titik bukanlah satu-satunya watak khas dalam regex. Terdapat sekitar selusin watak khas yang dapat digabungkan dengan literal untuk menggambarkan corak logik yang kompleks. Mari kita lihat dua contoh bagaimana literal dan watak khas digabungkan untuk menentukan ungkapan kompleks:

  • Sekiranya anda ingin memastikan bahawa rentetan teks adalah alamat e-mel, anda boleh mengujinya dengan corak regex ini: ^ [A-Z0-9 ._% + -] [dilindungi e-mel] [A-Z0-9.-] +. [AZ] {2,} $.
  • Untuk mengimbas nama fail dan menangkap yang berakhir dengan peluasan fail .php, anda boleh menggunakan regex berikut: ^. *. Php $.

Sekiranya anda baru menggunakan regex, corak itu mungkin agak membingungkan. Untuk memahami bagaimana corak tersebut berfungsi, anda perlu memahami maksud semua watak khas.

Watak Khas Regex

Walaupun setiap pelaksanaan regex sedikit berbeza dalam beberapa aspek, mereka semua memperlakukan watak khas ini dengan cara yang sama dengan beberapa pengecualian.

  • : Aksara garis miring terbalik digunakan untuk melarikan diri dari watak khas lain. Oleh itu, jika anda ingin melarikan diri dari watak lain, seperti titik, sehingga ia akan ditafsirkan sebagai watak literal, anda boleh melakukannya dengan mendahului titik dengan garis miring terbalik seperti ini: .
  • ^: Uptick digunakan untuk menunjukkan kedudukan awal dalam rentetan. Regex ^ a akan memadankan sebarang rentetan yang dimulai dengan huruf harfiah a.
  • $: Tanda dolar digunakan untuk mencocokkan kedudukan akhir dalam rentetan. Regex a $ akan memadankan sebarang rentetan yang diakhiri dengan huruf harfiah a.
  • .: Titik atau noktah sepadan dengan watak lain selain watak baris baru (n). Regex 1.3 akan memadankan sebarang rentetan dengan huruf harfiah, watak apa pun, dan tiga literal seperti 123, 1a3, dan bahkan 1 3.
  • |: Paip menegak adalah operator pilihan dan boleh ditafsirkan sebagai stand-in untuk perkataan atau. Jadi regex a | b dapat dibaca sebagai “a atau b” dan akan cocok dengan huruf a atau huruf b.
  • *: Tanda bintang digunakan untuk mencocokkan watak sebelumnya dengan sifar atau lebih banyak kali. Jadi regex. * Akan sama dengan rentetan sama sekali asalkan tidak mengandungi watak baris baru.
  • ?: Tanda tanya akan sepadan dengan watak sebelumnya sifar atau satu kali, tetapi tidak lebih. The regex 123? Oleh itu, akan sepadan dengan 12 atau 123.
  • +: Simbol tambah sepadan dengan watak sebelumnya satu atau beberapa kali, tetapi watak mesti muncul sekurang-kurangnya sekali, tidak seperti tanda bintang yang sepadan dengan watak sebelumnya sifar atau lebih banyak kali. Jadi, regex a * b + akan sepadan dengan ab dan b, tetapi bukan kerana b mesti muncul sekurang-kurangnya sekali kerana penggunaan simbol tambah.
  • […]: Tanda kurung sepadan dengan satu watak yang terdapat dalam tanda kurung. Atau, uptick boleh ditambahkan, seperti ini [^ …], untuk mencocokkan watak yang tidak terdapat dalam tanda kurung. Anda tidak perlu melepaskan watak khas dalam tanda kurung, mereka akan ditafsirkan sebagai huruf harfiah. Tanda kurung sering digunakan untuk menentukan julat watak. Contohnya, regex [0-9] akan sepadan dengan satu digit dan [A-Z] akan sepadan dengan huruf besar dalam abjad Inggeris. Akhirnya, tanda kurung boleh mengandungi watak yang dipisahkan dengan koma. Jadi [a, g] akan sesuai dengan salah satu huruf a dan g.
  • {…}: Pendakap keriting, disebut pengkuantitur eksplisit, menentukan berapa kali watak sebelumnya mesti muncul. Regex ab {2} c hanya dapat dipenuhi oleh abbc. Nombor kedua dapat ditambahkan untuk membuat rangkaian nilai yang dapat diterima. Oleh itu, ab {2,3} c akan sepadan dengan abbc atau abbbc dan [0-9] {1,2} akan sepadan dengan satu atau dua digit nombor.
  • (…): Parenthesis digunakan untuk menandakan subekspresi dalam ungkapan yang lebih besar. Jadi regex (abc) * akan sesuai dengan rentetan yang terdiri dari huruf abc, tetapi ketiga huruf harus muncul bersama dan dalam urutan itu.

Sendiri, watak khas agak berguna. Dalam kombinasi watak khas ini dengan literal, corak yang kuat dapat digambarkan. Senarai watak khas di atas merangkumi beberapa kombinasi watak khas yang ringkas. Mari kita lihat regex kedua untuk mengenal pasti fail PHP untuk melihat bagaimana watak-watak ini berfungsi bersama.

Berikut adalah regex yang dimaksudkan: ^. *. Php $. Mari kita ambil satu bahagian pada satu masa.

  • ^ menunjukkan permulaan rentetan ujian, yang dalam hal ini akan menjadi nama file.
  • .* bekerjasama untuk menunjukkan bahawa nama fail boleh berisi sebilangan watak, tetapi tidak ada baris baru.
  • .php dimulakan dengan watak pelarian yang memastikan titik itu ditafsirkan sebagai literal dan bukannya watak khas. Seterusnya, huruf literal php menunjukkan bahawa setelah nama fail, kami ingin memeriksa kombinasi titik dan huruf php.
  • $ menunjukkan bahawa sambungan .php mesti muncul di hujung rentetan carian agar sesuai.

Seperti yang anda lihat, hanya dalam sembilan aksara ini regex berjaya membuat corak logik yang dapat menyaring nama fail yang kompleks dan menentukan yang berakhir dengan pelanjutan fail .php.

Unicode dan Regex

Salah satu masalah yang boleh muncul ketika berurusan dengan regex adalah bagaimana menangani bahasa yang menggunakan watak-watak yang bukan merupakan bagian dari abjad Inggeris moden. Unicode adalah piawai pengekodan yang cuba menyelesaikan masalah ini dengan mengekod digit menjadi nilai angka.

Beberapa implementasi regex menyokong penggunaan Unicode untuk membina corak regex, yang bermaksud bahawa corak regex dapat dibuat yang akan dapat menguji rentetan yang merangkumi watak dari berbagai bahasa. Selain itu, ungkapan Unicode dapat digabungkan dengan literal dan watak khas untuk membina corak regex yang kompleks.

Beberapa corak regex Unicode yang paling biasa termasuk:

  • p {L}: Memadankan huruf apa pun dalam bahasa apa pun. Jadi, p {L} {2,4} sepadan dengan urutan huruf yang panjangnya antara dua hingga empat aksara.
  • p {Z}: Memadankan mana-mana watak ruang.
  • p {N}: Memadankan watak angka.
  • p {P}: Memadankan watak tanda baca.

Terdapat banyak sifat Unicode tambahan yang dapat Anda gunakan ketika membuat ekspresi reguler, dengan syarat implementasi yang Anda kerjakan mendukung Unicode regex. Untuk mengetahui lebih lanjut, baca Unicode Regular Expressions di Regular-Expressions.info.

Sumber

Kami telah membahas cukup banyak di buku asas ini untuk memberi anda gambaran asas tentang bagaimana regex berfungsi dan bagaimana anda dapat menggunakannya untuk menentukan bit tertentu kod dan teks dalam penyunting teks atau untuk mengenal pasti dan mengesahkan data dalam aplikasi komputer. Untuk mengetahui lebih lanjut, lihat sumber berikut yang memberikan maklumat yang lebih maju daripada yang telah kami bahas dalam tutorial ringkas ini:

  • Regular-Expressions.info: banyak pengetahuan mengenai regex dalam bentuk artikel dan tutorial.
  • Regex Cheatsheet dari RegExLib.com: cheatsheet berguna yang akan membantu anda mengekalkan semua watak khas yang berbeza.
  • RegExLib.com: repositori ungkapan biasa yang boleh anda salin dan ubah suai untuk memenuhi keperluan anda.

Salah satu cara terbaik untuk mendapatkan penulisan ungkapan biasa adalah dengan mula menulisnya. Alat dalam talian berikut akan membolehkan anda melakukan hal itu, membandingkan regex tersuai anda dengan sekumpulan teks khusus sehingga anda dapat mengetahui cara merumuskan ungkapan biasa yang berfungsi:

  • RegExr: tagline mengatakan semuanya, “Pelajari, Bangun, dan Uji RegEx.”
  • Regex Pal: buat corak regex dan kemudian uji rentetan untuk memastikannya melakukan apa yang anda mahukan.
  • Regex 101: tidak semua implementasi regex dibuat sama. Gunakan alat ini untuk menguji rentetan corak regex dan tingkah laku penyesuaian berdasarkan bahasa pengaturcaraan di mana anda akan menerapkan corak tersebut. PHP, JavaScript, Python, dan Erlang disokong.

Beberapa teks telah ditulis mengenai regex, tetapi tiga teksnya adalah yang terbaik di kelas. Sekiranya anda benar-benar ingin menguasai regex, salah satu daripada tiga teks ini akan membawa anda ke sana:

  • Buku Panduan Ekspresi Biasa: Penyelesaian Terperinci dalam Lapan Bahasa Pengaturcaraan (2012) oleh Goyvaerts dan Levithan
  • Memperkenalkan Ekspresi Biasa (2012) oleh Michael Fitzgerald
  • Menguasai Ekspresi Biasa (2006) oleh Jeffrey E F Friedl.

Ringkasan

Ungkapan biasa adalah alat bebas bahasa yang digunakan oleh pengaturcara komputer untuk membina corak logik. Corak ini kemudian dapat digunakan untuk mengenal pasti rentetan teks yang sesuai dengan corak. Pelaksanaan Regex berlimpah dan regex disokong oleh kebanyakan bahasa pengaturcaraan moden dan tersedia dalam alat carian yang terdapat dalam banyak editor teks. Memulakan regex boleh menjadi sukar, tetapi menguasai regex adalah langkah penting dalam pengembangan programmer komputer mana pun.

Bacaan dan Sumber Lanjut

Kami mempunyai lebih banyak panduan, tutorial, dan infografik yang berkaitan dengan komputer dan pengekodan:

  • Sumber Pengaturcaraan Bash: mulakan dengan shell baris arahan Unix yang paling penting.
  • Sed Pengenalan dan Sumber: penyunting aliran adalah alat yang hebat untuk menggunakan dan mempelajari ungkapan biasa.
  • Awk Resources: ketahui semua tentang alat adik sed. Awk.

Senarai Utama Alat Webmaster A-Z

Sed dan Awk dan Bash hanyalah sebahagian daripada koleksi besar alat yang membolehkan pentadbir sistem menguruskan sistem operasi. Senarai Utama Alat Webmaster A-Z akan memberi banyak pertolongan kepada anda dalam melakukan kerja anda.

Senarai Utama Alat Webmaster A-Z
Senarai Utama Alat Webmaster A-Z

Jeffrey Wilson Administrator
Sorry! The Author has not filled his profile.
follow me