Manual Ungkapan Biasa

Baca(27785) masa kemas kini(2022-04-13)

Ungkapan biasa, juga dikenali sebagai ungkapan biasa. (Bahasa Inggeris: Regular Expression, sering disingkat sebagai regex, regexp atau RE dalam kod), konsep dalam sains komputer. Jadual biasa biasanya digunakan untuk mendapatkan dan menggantikan teks yang sepadan dengan corak (peraturan) tertentu.


Ungkapan biasa ialah formula logik untuk operasi rentetan. Ia menggunakan beberapa aksara khusus yang telah ditetapkan dan gabungan aksara khusus ini untuk membentuk "rentetan peraturan" ini digunakan untuk menyatakan logik penapisan A untuk rentetan.

Banyak bahasa pengaturcaraan menyokong operasi rentetan menggunakan ungkapan biasa. Contohnya, Perl mempunyai enjin ekspresi biasa yang berkuasa terbina di dalamnya. Konsep ungkapan biasa pada asalnya dipopularkan oleh perisian alat dalam Unix (seperti sed dan grep). Ungkapan biasa sering disingkatkan sebagai "regex", tunggal termasuk regexp, regex, dan jamak termasuk regexps, regexs dan regexen.

Contoh ungkapan biasa pertama!

Instance

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>PHP中文网教程(php.sn)</title>
</head>
<body>

<script>
var str = "abc123def";
var patt1 = /[0-9]+/;
document.write(str.match(patt1));
</script>

</body>
</html>

Run Instance »

Klik butang "Run Instance" untuk melihat instance dalam talian

Petua: Tutorial ekspresi biasa kami akan membantu anda mempelajari pengetahuan ungkapan biasa dari pemula hingga lanjutan. Jika anda mempunyai sebarang soalan, sila pergi ke laman web PHP Cina Komuniti Ekspresi Biasa untuk bertanya soalan anda, dan netizen yang bersemangat akan menjawabnya untuk anda.

Ciri ekspresi biasa

  • sangat fleksibel, logik dan berfungsi

  • boleh mencapai kawalan rentetan yang kompleks dengan cara yang sangat mudah.

  • Bagi yang baru mengenalinya, ia agak kabur dan sukar untuk difahami.

Memandangkan objek aplikasi utama ungkapan biasa ialah teks, ia digunakan dalam pelbagai editor teks, daripada editor terkenal EditPlus kepada editor besar seperti Microsoft Word dan Visual Studio Ekspresi biasa boleh digunakan dalam semua Ungkapan untuk diproses kandungan teks.

Tujuan

Memandangkan ungkapan biasa dan rentetan lain, kita boleh mencapai tujuan berikut:

  • Sama ada rentetan yang diberikan mematuhi logik penapisan ungkapan biasa (dipanggil "padanan")

  • Kita boleh dapatkan bahagian khusus yang kita inginkan daripada rentetan melalui ungkapan biasa.

Enjin biasa

Enjin biasa boleh dibahagikan kepada dua kategori:

  • Satu ialah DFA,

  • Satu ialah NFA.

Kedua-dua enjin mempunyai sejarah yang panjang (lebih 20 tahun sekarang), dan terdapat banyak varian yang dihasilkan oleh kedua-dua enjin ini! Oleh itu, pengenalan POSIX mengelakkan penjanaan berterusan varian yang tidak diperlukan. Dengan cara ini, enjin biasa arus perdana dibahagikan kepada tiga kategori: 1. DFA, 2. NFA tradisional, dan 3. POSIX NFA.

Enjin DFA dijalankan dalam masa linear kerana ia tidak memerlukan penjejakan ke belakang (dan oleh itu ia tidak pernah menguji watak yang sama dua kali). Enjin DFA juga memastikan rentetan terpanjang yang mungkin dipadankan. Walau bagaimanapun, kerana enjin DFA hanya mengandungi keadaan terhad, ia tidak boleh memadankan corak dengan rujukan belakang dan kerana ia tidak membina pengembangan eksplisit, ia tidak dapat menangkap subungkapan.

Enjin NFA tradisional menjalankan algoritma penjejakan belakang padanan yang dipanggil "tamak" yang menguji semua kemungkinan pengembangan ungkapan biasa dalam susunan tertentu dan menerima padanan pertama. Oleh kerana NFA tradisional membina sambungan khusus bagi ungkapan biasa untuk mendapatkan padanan yang berjaya, ia boleh menangkap kedua-dua padanan subungkapan dan rujukan belakang yang sepadan. Walau bagaimanapun, kerana NFA tradisional berundur, ia boleh mengakses keadaan yang sama beberapa kali (jika ia dicapai melalui laluan yang berbeza). Oleh itu, dalam kes yang paling teruk, ia boleh berfungsi dengan sangat perlahan. Oleh kerana NFA tradisional menerima perlawanan pertama yang ditemuinya, ia juga mungkin menyebabkan perlawanan lain (mungkin lebih lama) tidak ditemui.

Enjin NFA POSIX adalah serupa dengan enjin NFA tradisional, kecuali ia akan terus berundur sehingga mereka dapat memastikan bahawa mereka telah menemui padanan yang paling lama. Oleh itu, enjin POSIX NFA adalah lebih perlahan daripada enjin NFA tradisional dan apabila menggunakan POSIX NFA, anda mungkin tidak mahu menukar susunan carian lihat balik untuk menyokong carian padanan yang lebih pendek dan bukannya carian padanan yang lebih panjang.

Program utama yang menggunakan enjin DFA ialah:

awk,egrep,flex,lex,MySQL,Procmail等;

Program utama yang menggunakan enjin NFA tradisional ialah:

GNU Emacs,Java,ergp,less,more,.NET语言,PCRE library,Perl,PHP,Python,Ruby,sed,vi;

Program utama yang menggunakan enjin POSIX NFA ialah:

mawk,Mortice Kern Systems’ utilities,GNU Emacs(使用时可以明确指定);

Terdapat juga hibrid DFA/NFA enjin:

GNU awk,GNU grep/egrep,Tcl。

Contoh untuk menggambarkan secara ringkas perbezaan antara kerja NFA dan DFA:

Sebagai contoh, terdapat rentetan ini adalah blog yansen, dan ungkapan biasa ialah /ya(msen|nsen|nsem)/ (don 'Tidak peduli dengan ungkapan, ini hanya untuk menggambarkan hubungan antara enjin) perbezaan kerja). NFA berfungsi seperti berikut Pertama, cari y dalam rentetan dan kemudian padankan sama ada ia diikuti oleh a, teruskan mencari sama ada ia diikuti oleh m Jika tidak, padankan sama ada ia diikuti oleh cawangan pemilihan msen dihapuskan pada masa ini).

Kemudian teruskan melihat jika ia diikuti oleh s, e, dan kemudian menguji sama ada ia adalah n, perlawanan itu berjaya. Mengapa m? Oleh kerana NFA berfungsi berdasarkan ungkapan biasa dan berulang kali menguji rentetan, rentetan yang sama mungkin diuji berkali-kali!

Ini tidak berlaku dengan DFA akan mencari y dalam urutan bermula dari t dalam ini dan mencari y Jika diketahui bahawa ia diikuti dengan a, maka ia akan menyemak sama ada ungkapan itu mempunyai a, dan berlaku untuk berada di sini. Kemudian rentetan a diikuti dengan n, dan DFA menguji ungkapan pada masa ini, msen tidak memenuhi keperluan dan dihapuskan. nsen dan nsem memenuhi keperluan, dan kemudian DFA menyemak rentetan dalam urutan Apabila n dalam sen dikesan, hanya cawangan nsen memenuhi keperluan, dan perlawanan itu berjaya!

Dapat dilihat daripada ini bahawa kedua-dua enjin berfungsi dengan cara yang sama sekali berbeza, Satu (NFA) berorientasikan ekspresi, dan satu lagi (DFA) berorientasikan teks! Secara umumnya, enjin DFA mencari dengan lebih pantas! Walau bagaimanapun, NFA adalah berorientasikan ekspresi dan lebih mudah untuk dimanipulasi, jadi kebanyakan pengaturcara lebih suka enjin NFA! Kedua-dua enjin mempunyai kekuatan mereka sendiri, dan petikan sebenar bergantung pada keperluan anda dan bahasa yang anda gunakan.

Kandungan yang diliputi dalam manual tutorial ungkapan biasa ini

Tutorial ungkapan biasa ini merangkumi semua pengetahuan asas dan lanjutan tentang ungkapan biasa, termasuk sintaks ungkapan biasa, metakarakter ungkapan biasa, keutamaan pengendali ungkapan biasa, peraturan padanan ungkapan biasa dan banyak lagi.

Petua: Setiap bab tutorial ini mengandungi banyak contoh ungkapan biasa Anda boleh terus klik butang "Jalankan Contoh" untuk melihat keputusan dalam talian. Contoh ini akan membantu anda belajar memahami ungkapan biasa dengan lebih baik.

Sumber rujukan pembelajaran berkaitan ungkapan biasa lain

Selain pengembangan pengetahuan di sebelah kanan halaman ini, sumber berikut juga dipilih untuk semua orang