Mengapa ekspresi reguler begitu menarik?

23

Gambar 1 , Gambar 2 , saya kira Anda tidak akan kesulitan untuk mengingat contoh lain.

Masalahnya adalah: jika ada lebih dari satu cara untuk memecahkan masalah, programmer PHP (saya biasanya menelusuri tag PHP di StackOverflow) akan meminta bantuan pada solusi yang melibatkan ekspresi reguler.

Bahkan ketika itu akan menjadi kurang ekonomis, bahkan ketika manual php menyarankan ( tautan ) untuk menggunakan str_replacealih-alih fungsi preg_*atau apa pun ereg_*ketika tidak ada aturan substitusi mewah yang diperlukan.

Apakah ada yang tahu mengapa ini terjadi?

Jangan salah paham, beberapa teman baik saya adalah ekspresi reguler dan saya tidak membenci Perl. Apa yang saya tidak dapatkan adalah mengapa tidak ada mencari alternatif apa pun, bahkan ketika berlebihan yang jelas (regex untuk mengganti string) atau kompleksitas kode meningkat secara eksponensial (regex untuk mendapatkan data dari html di PHP )

cbrandolino
sumber
2
Anda mungkin ingin mengutip apa yang sebenarnya dikatakan manual php.
ChrisF
1
Karena mereka samar, jadi Anda ingin menjadi bagian dari klub kewl kidz 'eksklusif? Dan sebagian besar karena mereka menyediakan cara singkat untuk mengekspresikan kecocokan atau ekstraksi, untuk itulah mereka dibuat. Tentu untuk kasus dummy, parsing kustom jika lebih baik, tetapi waktu dev lebih dari menulis regex cepat mendukung regex.
haylem
Anda menekankan bagian yang salah dari kalimat terakhir itu: Bagian keterlaluannya adalah "dari html", bukan "dalam PHP".
Izkata

Jawaban:

20

Mengapa ekspresi reguler begitu menarik?

Karena pada tingkat bawah sadar mereka merasa seperti seluruh program cerdas yang dapat menyelesaikan banyak hal dengan sendirinya sambil mencakup dan menyesuaikan diri (pola pikir).

Inilah sebabnya mengapa orang segera percaya bahwa ekspresi reguler akan menyelesaikan tugas berbasis teks mereka, entah bagaimana tidak berpikir itu mungkin berlebihan dan tidak menyadarinya mungkin saya kurang (parsing bahasa dengan itu).

Suatu hal kecil yang mengandung kekuatan sihir. Anda tidak bisa mengatakan tidak, bukan?

pengguna8685
sumber
5
+1 - Sesuatu yang samar , tidak kurang.
AJ Johnson
Hobi memang sulit
Ben DeMott
49

Ketika satu-satunya alat yang Anda miliki adalah regex, setiap masalah tampak seperti ^((?>[a-zA-Z\d!#$%&'*+\-/=?^_{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$

glenatron
sumber
16
Godaan untuk memilih jawaban ini sangat kuat, tetapi saya rasa saya harus menolak karena ini pertanyaan pertama saya yang terbuka di sini dan saya harus berpura-pura serius untuk sementara waktu.
cbrandolino
1
@ Ev, itu masuk akal. Komentar saya hanyalah cara yang lucu untuk menyatakan penghargaan saya atas jawabannya.
cbrandolino
17
Apa yang cocok dengan ini?
Tom O'Connor
4
Saya tidak tahu ... Saya pikir ini meringkas semuanya. Jika Anda tahu regex, dan tidak tahu tentang metode lain, mengapa Anda mencari? Anda sudah memiliki alat yang, jika dilakukan dengan benar, akan menangani pekerjaan itu. Sampai mereka menemukan metode yang lebih sederhana atau diberitahu tentang itu, regex akan menjadi metode catch-all, bahkan jika lebih kompleks dari yang seharusnya.
Aeo
4
@ Tom O'Connor Saya pikir itu sesuatu yang dekat dengan Regex untuk mencocokkan alamat email RFC 2822, tapi saya harus mengeluarkan beberapa karakter karena mereka mendatangkan malapetaka dengan penurunan harga.
glenatron
23

Saya pikir itu karena:

  1. Mereka sangat ringkas (bila digunakan dengan benar) dibandingkan dengan kode yang setara, dan
  2. Mereka didukung secara luas di seluruh bahasa pemrograman, sehingga sebagian besar pengembang mengenalnya.
hallidave
sumber
3
# 2 masuk akal.
cbrandolino
23

Pada fase awal karir saya (mis. Pra-PHP), saya adalah seorang guru Perl, dan salah satu aspek utama dari Perl gurudom adalah penguasaan ekspresi reguler.

Di tim saya saat ini, saya benar-benar satu-satunya dari kita yang meraih regex sebelum alat (biasanya nastier) lainnya. Sepertinya seluruh anggota tim mereka adalah sihir murni. Mereka akan meluncur ke meja saya dan meminta regex yang membutuhkan waktu sepuluh detik untuk saya kumpulkan, dan kemudian terpesona ketika itu bekerja. Saya tidak tahu - saya sudah bekerja dengan mereka begitu lama, itu wajar pada saat ini.

Dengan tidak adanya kelancaran regex, Anda memiliki kombinasi pernyataan kontrol aliran yang menyertakan pernyataan strstr dan strpos, yang menjadi jelek dan sulit dijalankan di kepala Anda. Saya lebih suka membuat satu regex elegan daripada tiga puluh baris pencarian string yang lamban.

Dan Ray
sumber
2
Saya tidak bisa cukup membuktikan hal ini.
CaffGeek
8
Saya ingin tahu: apakah Anda membaca regexp dengan lancar saat Anda menulisnya?
peterchen
7
Saya harap Anda mengadakan sesi pelatihan regex reguler dan / atau mendokumentasikan kode Anda; jika tidak, Anda akan membuat mimpi buruk dukungan untuk rekan kerja Anda. Waktu yang Anda selamatkan dengan menulis bahwa regex mungkin hilang seratus kali lipat oleh orang yang mencoba memahami apa yang dilakukan "regex elegan" itu.
Jeff Knecht
3
Sangat bagus. Anda dapat mendengar tarik ulur antara mencintai dan membenci regex di sini di komentar ini.
Dan Ray
1
@ Ben Lee: Saya kira begitu - OTOH, saya belum pernah menemukan regex yang dikomentari di alam liar. Beberapa masalah dengan regex mungkin didasarkan pada sikap dingin.
peterchen
16

Di sisi lain. Orang-orang yang membeo regex adalah meme jahat terlalu sering IMO. Jelas bahwa preg_match terlalu sering digunakan php, tetapi kurang jelas bahwa seringkali masuk akal untuk melakukannya (dalam PHP).

Saya akan pergi sejauh ini dan menduga bahwa itu adalah optimasi mikro lain di tanah php untuk menggunakan fungsi string. Ada banyak dan banyak yang berguna, dan mereka biasanya merupakan pilihan yang lebih baik. Tetapi Anda tidak harus menghindari preg_matchmendukung banyak strposdan ifrantai. Karena dalam praktiknya ternyata, libpcre seringkali lebih cepat daripada PHP dapat menjalankan loop mencari alternatif string misalnya

Sebagai contoh baru-baru ini membuat saya sadar, menguji apakah sebuah string adalah huruf kecil semua:

 if ($string == strtolower($string))

Lebih mudah dibaca daripada:

 if (!preg_match("/[A-Z]/", $string))

Dan Anda akan menganggap yang pertama harus lebih cepat, karena itu semua-PHP. Tetapi dalam kenyataannya regex hanya melihat ke string sekali, dan dapat membatalkan kondisi yang dinegasikan segera setelah menemukan huruf besar. Namun pendekatan strtolower () memeriksa string dua kali. Strtolower () pertama membuat string duplikat dengan mengulangi setiap huruf, membandingkan dan melapangkannya. Kemudian ==beralih ke yang asli dan salinan lagi, membandingkannya sekali lagi.

Jadi itu bukan kasus yang jelas. Dan untuk bersikap objektif yang pertama seringkali lebih cepat, karena Anda biasanya hanya membandingkan string pendek. Tetapi sangat penting untuk tidak membabi buta dengan asumsi bahwa fungsi string PHP selalu disarankan daripada ekspresi reguler.

(Saya tergoda untuk menambahkan kata-kata kasar lain tentang jawaban menyenangkan @ bobince mengenai xhtml-regexes, dan bagaimana ini baru-baru ini sering dikaitkan dengan cara yang sangat tidak membantu. Dan jawaban yang lebih objektif di bawah ini diabaikan.)

mario
sumber
1
Saya setuju dengan contoh Anda; tetap, dalam kasus khusus ini, saya lebih suka ´strtolower (): dalam kode non-kritis, bahkan optimasi waktu eksekusi yang besar (relatif terhadap implementasi lainnya) tidak signifikan - kecuali jika Anda ingin mengevaluasi huruf kecil- Tidak ada file teks besar, tapi saya tidak bisa membayangkan sebuah kasus di mana itu akan berguna.
cbrandolino
1
@cbrandolino: Tidak ada diskusi di sana. Barang-barang ini hanya boleh setiap relevan dan dievaluasi untuk loop bersarang, di mana itu mungkin membuat perbedaan faktual.
mario
4
+1 Sebenarnya orang selalu menampar mereka, jauh lebih banyak daripada yang didukung.
Orbling
1
Sebagai salah satu "bashers regexp": Sangat menyenangkan untuk melihat satu-liner lebih atau kurang mengekspresikan apa string "manual" parsing nedds 30 baris untuk. Namun, pemeliharaan menderita dalam contoh paling realistis. Selain itu, ketika mencoba menerapkannya pada input yang tidak divalidasi, membuat diagnosa yang sesuai untuk input yang ditolak membutuhkan akrobat tambahan. Bagi saya, ini adalah kode "tulis saja" prototipikal - keren untuk skrip cepat, menyebalkan untuk aplikasi yang tahan lama.
peterchen
1
Siapa pun yang tidak menulis semua regeksnya dalam /xmode untuk memungkinkan ruang kosong untuk ruang siku kognitif, dan untuk komentar untuk menjelaskan mengapa hal-hal sedang dilakukan, tentu saja telinganya harus dikotak. Tetapi untuk regex real dari kompleksitas yang masuk akal, Anda perlu mempertimbangkan untuk menerapkan desain top-down melalui regex gramatikal . Setelah Anda melihat cahaya, Anda tidak akan pernah kembali /@#$^^@#$^&&*)@#/.
tchrist
8

Ekspresi reguler sangat menarik karena merupakan alat terbaik untuk menguraikan bahasa biasa.

Mereka memiliki keunggulan sebagai berikut:

  • Mereka ringkas . Biasanya dibutuhkan lebih banyak kode untuk mem-parsing bahasa reguler tertentu menggunakan algoritma spesifik yang Anda buat daripada dengan regexp.
  • Mereka cepat digunakan. Biasanya dibutuhkan lebih banyak waktu untuk menulis parser untuk bahasa reguler tertentu menggunakan algoritma spesifik yang Anda buat daripada dengan regexp.
  • Mereka mudah . Setelah Anda mempelajari sekumpulan karakter khusus dan artinya, mudah untuk membuat regexp (walaupun sedikit lebih sulit untuk membacanya). Regexps adalah bahasa itu sendiri - sifat yang berguna karena spesies kita telah berevolusi menjadi sangat pandai bahasa.
  • Mereka cepat . Setelah dikompilasi, mereka dapat mencocokkan panjang string Ndalam waktu O ( N).
  • Mereka fleksibel . Mereka dapat mencocokkan bahasa reguler apa pun dan banyak data kami dinyatakan sebagai bahasa biasa.
  • Mereka ada di mana - mana . Sebagian besar bahasa pemrograman memiliki dukungan regexp dasar - baik melalui perpustakaan eksternal atau tertanam ke dalam bahasa itu sendiri. Juga tidak terlalu banyak variasi antara bahasa regexp itu sendiri.

Ini membuatnya menarik untuk situasi yang cocok untuk mereka, tetapi orang dapat menggunakannya dalam konteks di mana mereka bukan alat terbaik, karena mereka:

  • Tidak mengerti bahwa apa yang mereka cocokkan tidak dapat diekspresikan menggunakan regexp (mis. HTML).
  • Malas (dalam cara yang buruk) - mereka tahu alat dan mengakui bahwa itu bukan alat terbaik untuk apa yang mereka lakukan tetapi itu akan bekerja tanpa masalah 95% dari waktu dan membutuhkan 95% dari upaya belajar tertentu parser atau menulis satu dari awal.
  • Mereka tidak menyadari bahwa ada alat yang lebih baik.
david4dev
sumber
Eh, saya merujuk pada beberapa kasus tertentu di mana mereka jelas bukan cara terbaik untuk melanjutkan tetapi masih digunakan. Saya suka regex (maksud saya, mereka merasa membosankan dan tidak bernyawa tetapi masih sangat berguna dalam beberapa konteks), dan tahu apa kelebihan mereka.
cbrandolino
Saya setuju dengan yang lain, tapi cepat & mudah? Kurva pembelajarannya curam: untuk pemula, sulit untuk mencari tahu mengapa ekspresi tidak bekerja, dan setiap implementasi regexp tampaknya memiliki setidaknya perbedaan yang halus, jadi oyu harus berhati-hati dari mana Anda mencoba belajar.
peterchen
Mengapa semua orang bingung mengeluarkan sedikit HTML dengan mem-parsing halaman web lengkap menjadi parse penuh? Benar-benar bodoh. Percayalah, ketika saya mengedit halaman HTML vi, Anda bertaruh hidup Anda saya gunakan :%s/foo/bar/gcdi atasnya. Jika cukup baik untuk editor, cukup bagus untuk skrip.
tchrist
6

Hmmm, saya hanya bisa menebak. Mungkin beberapa orang pernah mengalami bahwa 30 baris kode mereka digantikan oleh regex sepanjang 20 karakter, jadi rasanya salah bagi mereka untuk menggunakan hal lain sebagai gantinya ketika regex dapat digunakan.

user281377
sumber
4

Ini sesuai dengan cara sebagian orang berpikir. Saya tidak suka mereka, tetapi saya punya teman yang tampaknya berpikir dalam regexps. Saya kira pola pencocokan bagian otak mereka lebih terbuka daripada logika formal. :-)

Lennart Regebro
sumber
6
Dalam hal sejarah evolusi kita, itu masuk akal. Kami mencocokkan pola jauh sebelum kami mendefinisikan tata bahasa atau menemukan silogisme.
glenatron
1
Saya tidak setuju, pemrograman melibatkan pencocokan logika dan pola, dua bidang. Regexps sangat bagus dalam pencocokan pola dan harus digunakan untuk tugas-tugas tersebut. Juga mengatakan "Saya tidak suka mereka", adalah membuang alat yang bagus untuk pekerjaan tertentu.
Orbling
@Orbling: Pertanyaannya bukan tentang mereka baik atau buruk, tetapi mengapa beberapa orang terlalu sering menggunakan mereka dan yang lain tidak.
Lennart Regebro
Pertanyaannya mungkin, tetapi jawaban Anda menyarankan satu atau jenis pikiran lain sedang bermain, bukan keduanya.
Orbling
Saya tidak berpikir "menyarankan" adalah kata yang benar.
Lennart Regebro
3

Saya pikir di mana-mana regex adalah karena di mana-mana string. String adalah struktur data paling sederhana, yang pertama yang kebanyakan kita pelajari. Karena semua kode kita ditulis dalam bentuk simbolis, wajar bagi seorang programmer untuk mempertimbangkan memodelkan sesuatu dalam bentuk simbolis. Tetapi jika bahasa pemrograman kami menawarkan perlawanan ketika kami mencoba memperluas sintaksisnya untuk bentuk simbolis baru kami yang cerdas, mereka semua berakhir di antara tanda kutip. Model data relasional memiliki SQL. Model data XML memiliki XQuery. Tapi bagaimana dengan model data string yang sederhana? Regex!

Baru kemarin, saya mencari API untuk kerangka Javascript baru yang mengkilap yang mendukung pengembangan game HTML5. Ini memiliki mekanisme deklaratif untuk menggambarkan subsistem utama yang dibutuhkan gim Anda. Bagaimana cara menentukan fitur tersebut? JSON? Notasi titik lancar? Array? Tidak - string yang berisi daftar nama fitur yang dipisahkan koma dan spasi putih. Saya bertanya-tanya bagaimana cara mem-parsing daftar itu ...?

WReach
sumber
2

Karena Anda dapat melihat semuanya sekaligus. Dengan bisa melihat semuanya, bisa lebih mudah untuk dikerjakan, dan itu selalu menyenangkan. Ini semacam alasan mengapa banyak programmer C ++ masih menggunakan pernyataan tipe printf: Ini bukan typesafe (meskipun gcc setidaknya dapat memeriksa tipe pada pernyataan printf), dan itu tidak cantik, tetapi anak laki-laki itu kompak dan dapat digunakan.

Jika itu adalah regex yang cukup sederhana, maka mereka seringkali ADALAH cara terbaik untuk melakukan sesuatu - bentuknya yang ringkas dan banyak kemampuan membuatnya sempurna untuk tugas-tugas tertentu. Masalahnya muncul ketika Anda membuat regex sangat rumit sehingga Anda tidak bisa membacanya lagi, atau ketika Anda menggunakan regex kompleks untuk melakukan sesuatu yang bisa lebih cepat dilakukan melalui operasi string sederhana.

Regex, seperti alat kuat lainnya, harus digunakan dalam jumlah sedang - tidak terlalu banyak, tidak terlalu sedikit. Dan kecuali kinerja adalah masalah besar, satu regex mungkin lebih cepat untuk menulis dan lebih mudah untuk di-debug daripada serangkaian operasi string.

Michael Kohne
sumber
2

Hmm, jawaban saat ini berpusat terlalu banyak pada aspek teknis, dan pro / kontra keterbacaan (yang merupakan poin penting). Jadi izinkan saya mencoba untuk menggesernya sedikit lebih ke lingkungan / komunitas PHP:

  • PHP Perlister sedikit saudara tiri . Dan bagian integral dari Perl adalah ekspresi reguler (mereka menemukan hal-hal itu, bukan?). Oleh karena itu salah satu alasan mengapa regexps meresap dalam PHP juga.
  • The kasus penggunaan dari PHP adalah kebetulan tidak banyak berbeda dengan kasus penggunaan untuk ekspresi reguler. PHP secara struktural digunakan untuk merekatkan bersama halaman-halaman HTML. Dan regexps bekerja pada teks. (apa yang dikatakan WReach)
  • Optimasi mikro . Seperti disebutkan sebelumnya: orang sering menggunakan fungsi regexps dan / atau string PHP setelah kecepatan yang dirasakan. Masalah inti di lingkaran PHP, tidak khusus untuk regexps.
  • Ekspresi reguler yang built-in . Dengan Python, di Jawa, di C #, di Ruby? ada ketersediaan, tetapi pencegah karena harus memuat modul tambahan. Dan lihat bagaimana dalam PHP atau Javascript di mana itu adalah fitur inti, pola penggunaannya berbeda. Pameran lain: CSS yang semakin sering digunakan.
  • The pengguna PHP yang bersalah. Ini sering terjadi. Ekspresi reguler mudah ditemukan, dan saya menunda fakta menyenangkan ini karena membosankan dalam kejelasannya: semua tutorial sialan dan buku pengantar PHP selalu mengajarkan tentang ekspresi reguler, tetapi gagal untuk mendidik tentang kasus penggunaan.
  • The API string di PHP dirancang oleh orang yang sama yang membawa Anda kutipan sihir dan namespace \ pemisah. Ini mencakup, lebih baik dari Jawa, tetapi tidak glamor secara keseluruhan. Khususnya jika string dapat berfungsi ganda sebagai objek (lihat Python), fungsi string mungkin mengalahkan regexps.

Tapi itu hanya sebagai catatan saja. Saya percaya itu tetap sebagian besar alasan persepsi dan teknis yang mengarah pada penggunaan berlebihan dan / atau menghindari ekspresi reguler pada umumnya. Namun PHP dan basis penggunanya memiliki beberapa properti yang memperumitnya, dan mengapa kita melihat lebih banyak pertanyaan tentang SO [rujukan?] Dan mereka "sangat menarik" di sana.

mario
sumber
1

Saya suka ekspresi reguler secara umum saya menemukan mereka lebih mudah dibaca / dipahami daripada 20 baris kode saya harus menggantinya. Ekspresi reguler pendek cepat dibaca dan dipahami dan relatif mudah dipertahankan (jika ekspresi berubah, Anda hanya memiliki satu baris untuk diubah dibandingkan dengan melihat melalui 20 baris kode untuk melakukan perubahan). Ada saat-saat di mana mereka disalahgunakan tetapi begitu juga banyak hal lainnya.

Alasan Anda mungkin melihat begitu banyak pelecehan terhadap mereka adalah karena Anda menjelajah bagian PHP dari StackOverFlow karena saya yakin Anda sadar ada banyak programmer PHP yang belum dewasa di luar sana.

stoj
sumber
1

Mengapa ekspresi reguler begitu menarik?

Mereka tidak. Mereka sebenarnya jelek sekali. Dan tidak bisa dimengerti. Mereka adalah kekejian yang harus dibunuh sesegera mungkin.

Sekarang, ini dikatakan, saya akan kembali ke debugging aplikasi Perl kecil. Tidak bisa menahannya; Sayangnya, kadang-kadang mereka masih merupakan alat terbaik untuk pekerjaan itu.

Rook
sumber
4
Saya suka mengatakan bahwa ekspresi reguler bukanlah "reguler" atau "ekspresif"
Andrew Barber
2
Mereka jelek dan tidak bisa dipahami jika Anda tidak memahaminya. Setelah Anda mencapai zen of regex, mereka benar-benar sangat elegan.
Dan Ray
1
-1 Untuk memutuskan bahwa semua programmer suka tidak jelas, dan kemudian tidak mempertimbangkan penjelasan lain yang mungkin. ... Menyatakan mengapa Anda berpikir mereka jelek atau tidak bisa dimengerti akan membantu.
Macneil
1
@ Macneil - Tolong, (meskipun ya, pikiran saya ada di sepanjang garis itu), kecuali Anda mengutip saya tidak menyatakan bahwa saya mengatakan / memutuskan sesuatu yang tidak saya lakukan (bagian pertama dari komentar Anda). Sejauh pertanyaan Anda, Anda menemukan mereka cantik ?! ... Bukan saya. Dan karena ini adalah situs yang subjektif, dan itu adalah opini subjektif, saya tidak perlu atau tidak ingin menjelaskannya. Saya juga tidak akan mencoba, dalam hal ini.
Benteng
1
@Rook - Saya pikir kebanyakan orang melihat ekspresi reguler yang kompleks, memutuskan semua ekspresi reguler jelek, dan kemudian berhenti berpikir. Faktanya, mereka adalah alat yang sangat elegan dan ekspresif jika Anda dapat menetapkan prasangka Anda tentang mereka. BTW, dengan logika Anda sendiri, banyak programmer tidak dapat melakukan aljabar, sehingga aljabar mungkin secara inheren jahat dan harus dihapuskan karena itu jelas tidak terlalu dimengerti.
Dan Ray
0

Manusia adalah makhluk yang menggunakan alat, dan ekspresi reguler adalah alat yang ampuh. Metafora yang bagus untuk ekspresi reguler adalah alat pengiris daging dari deli. Jika Anda ingin irisan kalkun setipis kertas, daging kornet, dll., Itu masalahnya. Namun, Anda membutuhkan tangan yang terampil untuk menggunakannya, karena Anda dapat memotong diri Anda dengan sangat buruk dan Anda tidak akan merasakan apa-apa sampai Anda melihat darah. Yang saya maksudkan dengan ini adalah bahwa masalah besar dengan ekspresi reguler adalah menghilangkannya sedikit berarti Anda mencocokkan sesuatu yang tidak seharusnya, atau sebaliknya, dan Anda tidak mengetahuinya sampai menyebabkan masalah lebih lanjut dalam prosesnya.

Larry Coleman
sumber
0

Ekspresi reguler sangat menarik karena mereka menggunakan kekuatan. Anda dapat melakukan pekerjaan yang sangat rumit dalam beberapa karakter.

Masalahnya adalah bahwa konstruksi ekspresi reguler standar bukanlah Turing-complete yang berarti bahwa ada program yang tidak dapat Anda implementasikan dengan ekspresi reguler, dan orang-orang tidak TAHU bahwa ketika mereka terpikat oleh kekuatan nyata ekspresi reguler.

Ini - saya kira - adalah alasan untuk kutipan jwz "sekarang mereka memiliki dua masalah".

Saya akan menduga bahwa ekspresi reguler Perl adalah lengkap Turing, tetapi tampaknya belum terbukti atau dibantah secara meyakinkan.

pengguna1249
sumber
0

Karena ini adalah cara yang efisien untuk memprogram mesin keadaan terbatas, yang merupakan alat yang kuat ketika itu berlaku. Ini pada dasarnya adalah bahasa sendiri untuk pemrograman FSM, yang berguna jika Anda tahu bahasa, menjengkelkan jika Anda tidak.

DanTilkin
sumber
0

Dalam pengalaman saya, regex seperti seni kuno, sesuatu yang tidak jelas, beberapa orang membenci mereka karena mereka tidak dapat memahami sihir yang terlibat dan mungkin karena tidak ada yang akan menjelaskannya kepada Anda. Saya belum pernah mendengar ada universitas yang mengajar mereka untuk hal yang kurang sepele daripada mencocokkan email. Lalu ada cara batin mistiknya, karena kebanyakan orang tidak memahaminya, mereka pasti lambat . Dan membuat mereka bekerja dengan baik pada percobaan pertama selalu merupakan tantangan bagi pendatang baru.

Hal yang sama dapat dikatakan tentang Perl, awk, Linux, dan segala sesuatu yang tidak memiliki tombol mengkilap atau sintaks berwarna yang bagus. Jadi, ini seperti menambah kompleksitas pada "tugas-tugas sepele", cukup lemparkan beberapa loop, splits, switch, beberapa magic dan hanya itu, sesuatu yang mungkin berhasil. Tapi yah, jika Anda berada di sisi lain jalan, regex adalah pemotong cookie yang indah yang terlihat seperti sinyal noise tanpa loop yang buruk atau lebih banyak hal untuk di-debug. Saya suka mereka juga untuk fleksibilitas yang mereka berikan. Ketika pola untuk mencocokkan perubahan, Anda hanya mengubah regex, bukan algoritma, atau alat / apa pun, dan itu bagus dan berfungsi kembali. Dan karena itu adalah string ajaib, Anda dapat meletakkannya di luar kode sumber jika Anda mau. Dan satu hal lagi yang membuat saya berpikir tentang perl, jika Anda menulis regex yang panjangnya 20+ karakter, rasanya Anda telah menyelesaikan banyak hal, setidaknya bagi saya, itu sangat rapi dan kompak. Saya seorang programmer malas juga, saya tidak suka menulis banyak kode dengan identifikasi dan komentar yang bagus dan menambahkan beberapa bug ke dalam campuran.

alfa64
sumber