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_replace
alih-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 )
sumber
Jawaban:
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?
sumber
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)>)$
sumber
Saya pikir itu karena:
sumber
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.
sumber
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_match
mendukung banyakstrpos
danif
rantai. Karena dalam praktiknya ternyata, libpcre seringkali lebih cepat daripada PHP dapat menjalankan loop mencari alternatif string misalnyaSebagai contoh baru-baru ini membuat saya sadar, menguji apakah sebuah string adalah huruf kecil semua:
Lebih mudah dibaca daripada:
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.)
sumber
/x
mode 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/@#$^^@#$^&&*)@#/
.Ekspresi reguler sangat menarik karena merupakan alat terbaik untuk menguraikan bahasa biasa.
Mereka memiliki keunggulan sebagai berikut:
N
dalam waktu O (N
).Ini membuatnya menarik untuk situasi yang cocok untuk mereka, tetapi orang dapat menggunakannya dalam konteks di mana mereka bukan alat terbaik, karena mereka:
sumber
vi
, Anda bertaruh hidup Anda saya gunakan:%s/foo/bar/gc
di atasnya. Jika cukup baik untuk editor, cukup bagus untuk skrip.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.
sumber
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. :-)
sumber
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 ...?
sumber
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.
sumber
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:
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber
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.
sumber