Ekspresi reguler tidak

36

Tanyakan bahkan kepada seseorang dengan latar belakang dalam ilmu komputer apa ekspresi reguler itu, dan jawabannya cenderung melampaui batasan berada dalam jangkauan robot kondisi-terbatas.

Misalnya, "ekspresi reguler"

/^1?$|^(11+?)\1+$/

dibuat oleh kepribadian Perl yang terkenal Abigail (dan bagian dari rangkaian uji Perl sejak 2002) menggambarkan sebuah mesin yang hanya menerima bilangan unary gabungan, tetapi latihan 4.5 (b) dalam edisi ketiga Peter Pengantar An Pengantar Bahasa Resmi dan Automata digunakan pembaca. yang lemma memompa untuk membuktikan bahwa

L={an:n is not a prime number}

bukan bahasa biasa.

Dalam konteks di mana perbedaan itu penting, apa yang harus kita sebut ungkapan yang lebih kuat?

Greg Bacon
sumber

Jawaban:

46

Larry Wall mengusulkan agar kami menggunakan "ekspresi reguler" untuk formalisme yang diusulkan Kleene, dan "regex" untuk ekspresi untuk ekstensi yang banyak digunakan. Itu adalah konvensi yang cukup diikuti. Jika Anda ingin memperjelas bahwa Anda berbicara tentang ekspresi reguler dalam pengertian bahasa formal, biasanya tidak sulit untuk diterjemahkan ke dalam pembicaraan tentang bahasa biasa.

Kekuatan regex berasal dari backtracking, dan telah ada pekerjaan yang dilakukan pada automata untuk bahasa reguler dengan backtracking. Lihat, khususnya, Becchi & Crowley, 2008, Memperluas Finata Automata hingga Mencocokkan Ekspresi Reguler Kompatibel yang Efisien secara Efisien .

Charles Stewart
sumber
5
Saya setuju, sesuatu seperti "Perl regex" ("POSIX regex", dll.) Vs. "bahasa reguler" harus cukup jelas untuk mencegah segala kemungkinan salah tafsir.
Jukka Suomela
Perl regex memiliki lebih banyak fitur tambahan daripada sekadar backtracking.
reinierpost
@reinierpost Benar, tapi saya pikir mundur adalah yang paling penting dari perspektif bahasa formal. Reg reges Perl memiliki fitur seperti mengeksekusi kode Perl arbitrer, tetapi saya pikir regex harus ditafsirkan secara longgar sebagai meliputi PCRE. PCRE mengandung keanehan seperti pola rekursif, tetapi ini adalah seni gelap, membawa Anda jauh di luar bidang bahasa biasa. Saya bisa memperbarui jawaban saya untuk membahasnya.
Charles Stewart
18

Ungkapan-ungkapan ini telah diperiksa oleh Aho (Buku Pegangan Ilmu Komputer Teoritis, Vol. A, Chp. 5) dan Campeanu, Salomaa, Yu ("Sebuah studi formal ekspresi reguler praktis", International Journal of Foundations of Computer Science, 14: 1007 –1018, 2003), serta beberapa makalah tindak lanjut.

Aho menyebut ungkapan yang lebih kuat "rewbr" (ekspresi reguler dengan referensi-ulang), Campeanu et al. gunakan "ekspresi reguler yang diperluas" serta "ekspresi reguler yang praktis". Seperti kelihatannya, "extended regular expression" adalah istilah yang paling umum digunakan dalam literatur terbaru.

Mengembangkan istilah "ekspresi rasional" dari sekolah Perancis, dan mengingat fakta bahwa ungkapan-ungkapan itu digunakan di dunia nyata, saya sendiri suka "ekspresi nyata".

Tambahan: Sebuah bab dalam tesis PhD saya membahas kelas bahasa formal ini (makalah yang sesuai akan muncul di STACS 2011). Saat menulis bab dan makalah itu, saya bereksperimen dengan berbagai istilah. Akhirnya, saya memutuskan untuk menggunakan ekspresi reguler yang diperluas untuk model dengan backreferences, dan ekspresi reguler yang tepat untuk ekspresi reguler yang bagus dan normal. Karena cukup menjengkelkan untuk mengubah terminologi dalam makalah yang sudah sepenuhnya (atau sebagian besar) ditulis, saya berpikir bahwa beberapa mungkin tertarik pada pengalaman yang mengarah pada pilihan saya:

Pertama, regex dan rewbr tidak benar-benar menggulung lidah, dan menggunakannya berulang kali dalam keseluruhan makalah menjadi sangat melelahkan untuk menulis dan membaca, khususnya ketika menggunakan salah satu bentuk jamak yang mungkin. Ekspresi reguler seperti PERL juga cukup sulit. Tentu saja, saya bukan penutur asli, jadi YMMV.

Kedua, segera setelah seseorang ingin berbicara tentang kedua model, akan lebih mudah untuk menggunakan istilah yang merupakan variasi dari ekspresi reguler , karena ini memungkinkan seseorang untuk menekankan kesamaan atau perbedaan sesuai kebutuhan (misalnya, "ekspresi reguler, apakah itu tepat atau diperpanjang "). Lebih jauh, ini memungkinkan seseorang untuk dengan mudah menekankan kasus khusus "ekspresi reguler yang diperluas tanpa referensi belakang", ketika berbicara tentang kasus khusus di seluruh kelas, daripada membandingkan model yang berbeda.

Ketiga, saya lebih suka menggunakan istilah yang sudah digunakan dalam literatur daripada istilah yang baru diciptakan, yang membuat saya pilihan ekspresi reguler yang diperluas dan ekspresi reguler yang praktis . Pilihan kedua menyiratkan (setidaknya secara implisit) bahwa ekspresi reguler yang tepat entah bagaimana tidak praktis, yang terasa agak aneh (terutama karena RE2 Google tidak menggunakan backrefs, dan tampaknya cukup praktis).

Tentu saja, pilihan ini hanya "maksimum lokal pribadi" saya, dan tergantung pada kebutuhannya, pilihan lain mungkin lebih tepat.

Dominik D. Freydenberger
sumber
7
Sayangnya, istilah extended regular expression sudah dipakai oleh POSIX, yang membedakan antara basic regular expression (BRE) dan extended regular expression (ERE) , yang keduanya merupakan ekspresi reguler yang diperluas sesuai dengan definisi Anda.
Jörg W Mittag
@ Jörg: Sebenarnya menurut ini, ekspresi reguler POSIX yang diperluas maupun yang mendasar tidak lebih kuat daripada ekspresi reguler reguler. Dan murni (non-GNU) BRE tampaknya benar-benar kurang kuat daripada ekspresi reguler (hilang operator alternatif).
sepp2k
Lihat "On Extended Regular Expressions" oleh Carle dan Narendran (2009) untuk hasil yang lebih baru tentang "rewbr" ini: portal.acm.org/citation.cfm?id=1533235
Jakob
Hasil terbaru lebih lanjut tentang kelas bahasa ini: "Di persimpangan bahasa regex dengan bahasa reguler" oleh Campeanu dan Santean (TCS 410, 2009) "Tes Kecocokan Waktu Polinomial untuk Kelas Besar Ekspresi Reguler Diperpanjang Diperpanjang" oleh Reidenbach dan Schmid (CIAA 2010 ), dan "Ekspresi Reguler Diperpanjang: Kejelasan dan Keterpisahan" (menurut saya, akan muncul di STACS 2011).
Dominik D. Freydenberger
6

Diketahui bahwa reg's perl disebut cukup kuat untuk menjadi Turing lengkap; bahkan ada kompiler dari program biasa ke perl regexp.

Oleh karena itu saya ragu masuk akal untuk mencari nama untuk "regexps" semacam ini.

Lihat misalnya di http://search.cpan.org/~asavige/Acme-EyeDrops-1.62/lib/Acme/EyeDrops.pm

Arthur MILCHIOR
sumber
Apakah Anda memiliki beberapa petunjuk?
András Salamon
5
@ András: Saya pikir Arthur berbicara tentang ?{CODE}direktif Perl , yang memungkinkan ekspresi pola untuk menyisipkan kode program dalam ekspresi reguler. Saya mengerti bahwa PCRE didefinisikan secara usus sebagai bagian "deklaratif" dari bahasa tersebut, seluruh bahasa disebut bahasa pola. Menurut WP, Aho, 1990, "Algoritma untuk menemukan pola dalam string" menunjukkan bahwa masalah keanggotaan untuk bahasa biasa dengan backtracking adalah NP lengkap. Tidak ada fitur keras lainnya untuk PCRE deklaratif.
Charles Stewart
Saya menambahkan tautan; Saya tidak melihat kode sumber, jadi saya tidak benar-benar tahu cara kerjanya dan jika ada bukti bahwa kompilasi benar-benar benar.
Arthur MILCHIOR
1
Maaf, tetapi menurut argumen Anda, karena lambda-calculus adalah Turing-complete, tidak masuk akal untuk mencari nama untuk itu. Sama untuk semua formalisme dan bahasa komputasi lengkap-Turing lainnya. Lebih tepatnya, kelengkapan Turing tidak menggambarkan seberapa ekspresif suatu bahasa, sehingga tidak masuk akal untuk mengidentifikasi bahasa hanya karena mereka Turing-lengkap. Contoh saya tentang lambda-calculus adalah contoh ekstrem, tentu saja.
Blaisorblade
2

Saya pikir istilah terbaik untuk "ekspresi reguler dalam konteks automata" adalah "ekspresi rasional", seperti yang digunakan, katakanlah, dalam Elements of Automata Theory Sakarovitch, atau Handbook of Weighted Automata.

Michaël Cadilhac
sumber
1
Tidak terlalu umum digunakan, IMHO.
Blaisorblade
Ini / banyak digunakan dalam teori automata tertimbang, lihat en.wikipedia.org/wiki/Rational_language . Saya telah melihatnya beberapa kali di bidang bahasa daripada kelompok.
Michaël Cadilhac
1

Dengan jawaban yang lain, saya akan menyarankan bahwa "bahasa biasa" aman, dan setelah singkat berkomentar perbedaannya, untuk berbicara tentang "ekspresi reguler praktis" untuk regexs (dengan backtracking).

Juga perhatikan bahwa regexp yang sama, sebagai ekspresi reguler dan sebagai yang praktis, dapat memiliki semantik yang berbeda, karena dalam kasus yang terakhir semantik didefinisikan dalam hal pengulangan, dengan hasil yang berbeda. Detail akan di luar topik, tetapi saya akan menjawab jika Anda mengajukan pertanyaan lain tentang hal itu (mungkin pada SO daripada di sini, tidak tahu) dan memberi tahu saya melalui komentar.

Blaisorblade
sumber
0

Kita bisa menyebutnya ekspresi pola . Ini mungkin menimbulkan kebingungan dengan bahasa pola, tetapi setidaknya ini kurang umum.

Raphael
sumber
2
Pada prinsipnya, saya setuju dengan alasan Anda, tetapi Campeanu, Santean, dan Yu telah menggunakan istilah ekspresi pola untuk menunjukkan kelas bahasa yang serupa dengan definisi "bersih" (lihat "Ekspresi pola dan pola automata", IPL 92 (2004) )
Dominik D. Freydenberger