Ketahui rasa regex Anda
Ada sejumlah orang yang berpikir bahwa ekspresi reguler pada dasarnya adalah agnostik bahasa. Namun, sebenarnya ada perbedaan yang cukup besar antara rasa, dan terutama untuk golf kode, ada baiknya untuk mengetahui beberapa di antaranya, dan fitur-fiturnya yang menarik, sehingga Anda dapat memilih yang terbaik untuk setiap tugas. Berikut ini adalah ikhtisar tentang beberapa rasa penting dan apa yang membedakan mereka dari yang lain. (Daftar ini tidak dapat benar-benar lengkap, tetapi beri tahu saya jika saya melewatkan sesuatu yang sangat mencolok.)
Perl dan PCRE
Saya melempar ini ke dalam panci tunggal, karena saya tidak terlalu terbiasa dengan rasa Perl dan kebanyakan setara (PCRE adalah untuk Ekspresi Reguler Kompatibel-Kompatibel setelah semua). Keuntungan utama dari rasa Perl adalah bahwa Anda benar-benar dapat memanggil kode Perl dari dalam regex dan substitusi.
- Rekursi / subrutin . Mungkin fitur yang paling penting untuk bermain golf (yang hanya ada dalam beberapa rasa).
- Pola bersyarat
(?(group)yes|no)
.
- Mendukung mengubah kasus dalam string pengganti dengan
\l
, \u
, \L
dan \U
.
- PCRE memungkinkan pergantian tampilan, di mana setiap alternatif dapat memiliki panjang yang berbeda (tetapi tetap). (Sebagian besar rasa, termasuk Perl membutuhkan tampilan tetap untuk memiliki panjang tetap keseluruhan.)
\G
untuk menambatkan pertandingan ke akhir pertandingan sebelumnya.
\K
untuk mengatur ulang awal pertandingan
- PCRE mendukung properti karakter dan skrip Unicode .
\Q...\E
untuk menghindari lari karakter yang lebih lama. Berguna saat Anda mencoba mencocokkan string yang berisi banyak meta-karakter.
.BERSIH
Ini mungkin rasa yang paling kuat, dengan hanya sedikit kekurangan.
Salah satu kekurangan penting dalam hal bermain golf adalah tidak mendukung quantifiers posesif seperti beberapa rasa lainnya. Alih-alih .?+
Anda harus menulis (?>.?)
.
Jawa
- Karena bug (lihat Lampiran) Java mendukung jenis tampilan variabel-panjang yang terbatas di belakang: Anda dapat melihat di belakang sampai ke awal string dengan
.*
dari mana Anda sekarang dapat memulai lookahead, seperti (?<=(?=lookahead).*)
.
- Mendukung penyatuan dan persimpangan kelas karakter.
- Memiliki dukungan paling luas untuk Unicode, dengan kelas karakter untuk "skrip Unicode, blok, kategori, dan properti biner" .
\Q...\E
seperti pada Perl / PCRE.
Rubi
Dalam versi terbaru, rasa ini sama kuatnya dengan PCRE, termasuk dukungan untuk panggilan subrutin. Seperti Java, ini juga mendukung penyatuan dan persimpangan kelas karakter. Satu fitur khusus adalah kelas karakter bawaan untuk digit hex: \h
(dan yang dinegasikan \H
).
Fitur yang paling berguna untuk bermain golf adalah bagaimana Ruby menangani bilangan bulat. Terutama, dimungkinkan untuk mengukur sarang tanpa tanda kurung. .{5,7}+
bekerja dan begitu juga .{3}?
. Juga, sebagai lawan dari kebanyakan rasa lainnya, jika batas bawah pada kuantifier 0
dapat dihilangkan, misalnya .{,5}
setara dengan .{0,5}
.
Adapun subrutin, perbedaan utama antara subrutin PCRE dan subrutin Ruby, adalah bahwa sintaks Ruby adalah satu byte lebih panjang (?n)
vs \g<n>
, tetapi subrutin Ruby dapat digunakan untuk menangkap, sedangkan PCRE me-reset menangkap setelah subrutin selesai.
Terakhir, Ruby memiliki semantik berbeda untuk pengubah yang berhubungan dengan jalur dibandingkan kebanyakan rasa lainnya. Pengubah yang biasa disebut m
dengan citarasa lain selalu menyala di Ruby. Jadi ^
dan $
selalu cocok dengan awal dan akhir garis, tidak hanya awal dan akhir string. Ini dapat menghemat satu byte jika Anda memerlukan perilaku ini, tetapi akan dikenakan biaya tambahan byte jika tidak, karena Anda harus mengganti ^
dan $
dengan \A
dan \z
, masing-masing. Selain itu, pengubah yang biasanya disebut s
(yang membuat .
umpan baris cocok) disebut m
di Ruby sebagai gantinya. Ini tidak mempengaruhi jumlah byte, tetapi harus diingat untuk menghindari kebingungan.
Python
Python memiliki rasa yang kuat, tapi saya tidak mengetahui adanya fitur yang sangat berguna yang tidak akan Anda temukan di tempat lain.
Namun , ada rasa alternatif yang dimaksudkan untuk menggantikan re
modul di beberapa titik, dan yang mengandung banyak fitur menarik. Selain menambahkan dukungan untuk rekursi, tampilan panjang variabel dan operator kombinasi kelas karakter, ini juga memiliki fitur unik pencocokan fuzzy . Intinya, Anda dapat menentukan sejumlah kesalahan (penyisipan, penghapusan, pergantian) yang diizinkan, dan mesin juga akan memberi Anda perkiraan kecocokan.
Naskah ECMAS
Rasa ECMAScript sangat terbatas, dan karenanya jarang sangat berguna untuk bermain golf. Satu-satunya hal yang terjadi adalah kelas karakter kosong yang dinegasikan [^]
untuk mencocokkan karakter apa pun serta kelas karakter kosong yang gagal tanpa syarat []
(sebagai lawan dari yang biasa (?!)
). Sayangnya, rasanya tidak memiliki fitur yang membuat yang terakhir berguna untuk masalah normal.
Lua
Lua memiliki citarasa yang cukup unik, yang cukup terbatas (mis. Anda bahkan tidak dapat mengukur kelompok) tetapi memang hadir dengan sejumlah fitur yang berguna dan menarik.
- Ada sejumlah besar singkatan untuk kelas karakter bawaan , termasuk tanda baca, karakter huruf besar / kecil dan digit hex.
- Dengan
%b
itu mendukung sintaks yang sangat kompak untuk mencocokkan string seimbang. Misalnya %b()
cocok dengan (
dan kemudian semuanya hingga cocok )
(melewatkan dengan benar pasangan yang cocok dalam). (
dan )
dapat berupa dua karakter apa pun di sini.
Dorongan
Rasa regex Boost pada dasarnya adalah Perl. Namun, ia memiliki beberapa fitur baru yang bagus untuk penggantian regex, termasuk perubahan kasus dan persyaratan . Yang terakhir ini unik untuk Meningkatkan sejauh yang saya ketahui.