Apa definisi dari ekspresi reguler?

10

Baru-baru ini saya berdebat dengan Ghoti tentang apa yang merupakan ungkapan reguler dalam komentar atas jawaban saya untuk pertanyaan ini . Saya mengklaim bahwa berikut ini adalah ekspresi reguler:

`[Rr]eading[Tt]est[Dd]ata`

Ghoti tidak setuju, mengklaim itu adalah file glob sebagai gantinya. The glob halaman di klaim wikipedia bahwa (penekanan):

Glob tidak termasuk sintaks untuk bintang Kleene yang memungkinkan pengulangan berganda dari bagian sebelumnya dari ekspresi; dengan demikian mereka tidak dianggap sebagai ekspresi reguler, yang dapat menggambarkan serangkaian bahasa reguler yang lebih besar daripada alfabet terbatas apa pun yang diberikan.

Namun, tidak ada kutipan untuk klaim ini, menunjukkan bahwa itu hanya pendapat editor wikipedia tertentu.

Spesifikasi The UNIX Tunggal, Versi 2 , menyatakan bahwa Ekspresi Reguler Dasar (BRE) bahkan dapat menjadi karakter tunggal:

Karakter biasa adalah BRE yang cocok dengan dirinya sendiri: setiap karakter dalam rangkaian karakter yang didukung, kecuali untuk karakter khusus BRE yang tercantum dalam Karakter Khusus BRE.

Jadi, apa definisi dari ekspresi reguler di dunia * nix, dan apakah definisi itu mengecualikan gumpalan file?

terdon
sumber
6
Dalam CS teoretis, ekspresi reguler adalah deskripsi dari bahasa biasa, yang merupakan salah satu yang dapat dikenali oleh otomat terbatas. Di dunia Unix, ini jauh lebih rumit, dan tidak ada definisi tunggal. Ada 2 dialek regex di POSIX spesifikasi: diperpanjang dan dasar, yang digunakan oleh alat seperti grep, sed, dan awk. Vim menggunakan varietasnya sendiri, seperti halnya Perl.
jw013
Jadi, dengan definisi itu, file glob adalah BRE kan?
terdon
2
Tidak, file glob BUKAN BRE - apa yang membuat Anda berpikir itu? Jika Anda membaca deskripsi POSIX tentang BRE dan deskripsi POSIX tentang globbing, Anda akan melihat bahwa itu tidak sama. Misalnya, *memiliki dua arti berbeda dalam BRE dan gumpalan. Catatan: Saya tidak berpikir istilah glob digunakan di mana saja di spec POSIX - itu disebut Pencocokan Pola dan dijelaskan dalam bab bahasa shell.
jw013

Jawaban:

10

Seperti lk- mengatakan, yang -namepilihan findakan memperlakukan argumen sebagai gumpal, bukan ekspresi reguler.

Apakah string ditafsirkan sebagai gumpalan atau regex atau hanya string biasa tergantung pada apa yang digunakan untuk melakukan interpretasi. Ini masalah konteks. String dalam contoh Anda, [Rr]eading[Tt]est[Dd]atadapat dievaluasi dalam sejumlah cara yang berbeda, tapi apa itu adalah tergantung pada bagaimana Anda menggunakannya. Gunakan itu sebagai bola, itu bola. Gunakan itu sebagai regex, itu adalah regex. Dalam kasus pertanyaan dari mana asalnya , OP menggambarkan string sebagai regex. Karena itu kita dapat mengasumsikan dia berencana menafsirkannya sebagai sebuah regex.

Karakter tunggal juga bisa menjadi regex, tentu saja. Ini juga bisa menjadi string, dan juga bisa menjadi bola. Itu bisa diartikan sebagai byte atau tinyint, jika Anda suka. Itu semua tergantung konteks.

Ada sejumlah spesifikasi untuk ekspresi reguler dalam berbagai bentuk. BRE dan ERE didokumentasikan dengan baik. PCRE menambahkan sejumlah fungsionalitas. Banyak penerjemah regex akan mengimplementasikan, misalnya, "semua ERE dan beberapa PCRE". Atau mereka akan melakukan ERE dikurangi beberapa fitur. Jika Anda menggunakan spesifikasi formal, banyak alat mengklaim dukungan regex yang ternyata salah atau tidak lengkap. Mengetahui perinciannya memungkinkan Anda menyesuaikan solusi Anda dengan koleksi fungsi yang tersedia dalam alat apa pun yang mengevaluasi regex Anda.

Jadi ... jika Anda mencari definisi yang "mengecualikan" gumpalan, Anda melihat ini dari perspektif yang salah. Apa itu ditentukan oleh bagaimana Anda menggunakannya .

ghoti
sumber
7

[Rr]eading[Tt]est[Dd]atatampaknya valid sebagai glob dan ekspresi reguler, dan saya percaya memiliki "makna" yang sama dalam kedua interpretasi. Namun, -nameopsi findakan memperlakukan argumen sebagai gumpalan, bukan ekspresi reguler.

Perbedaan ini akan menjadi masalah jika Anda memberikan argumen seperti foo*, yang merupakan glob yang valid dan ekspresi reguler yang valid, tetapi memiliki arti yang berbeda tergantung pada interpretasinya:

Jika diartikan sebagai pola gumpal, ini akan cocok foo, foobar, foo123, dll

Jika diartikan sebagai ekspresi reguler, ini akan cocok fo, foo, foooooo, dll

lk-
sumber
Terima kasih, saya melihat perbedaan antara pola glob dan regex. Apa definisi formal dari regex?
terdon
1
Saya tidak tahu apakah ada definisi tunggal untuk "ekspresi reguler" seperti istilah yang umum digunakan. Ada spesifikasi sintaks yang berbeda, seperti ekspresi reguler POSIX atau ekspresi reguler Perl, yang mencakup "fitur" lain seperti backreferences atau lookaheads. Ini mungkin bukan lagi ekspresi reguler dalam arti yang paling ketat (dalam konteks bahasa formal reguler) tetapi masih disebut demikian.
lk-