Ada beberapa tantangan keren yang melibatkan regex ( Self-matching regex , Regex validate regex )
Ini mungkin tidak mungkin, tetapi adakah regex yang HANYA cocok dengan dirinya sendiri?
CATATAN, pembatas harus disertakan:
misalnya /thing/
harus cocok /thing/
dan tidak thing
. Satu-satunya kecocokan yang mungkin untuk ekspresi Anda haruslah ekspresi itu sendiri. Banyak bahasa memungkinkan implementasi string menggantikan ekspresi reguler. Misalnya di Go
package main
import "fmt"
import "regexp"
func main() {
var foo = regexp.MustCompile("bar")
fmt.Println(foo.MatchString("foobar"))
}
tetapi demi tantangan, biarkan ekspresi dibatasi (simbol awal, ekspresi, simbol akhir ex: /fancypantpattern/
atau @[^2048]@
), jika Anda ingin memperdebatkan tanda kutip sebagai pembatas Anda, maka jadilah itu. Saya pikir mengingat kesulitan yang tampak dari masalah ini, itu tidak akan membuat banyak perbedaan.
Untuk membantu Anda:
Peretasan cepat saya buat untuk rubular.com (halaman web untuk mengedit ruby regex):
var test = document.getElementById("test")
,regex = document.getElementById("regex")
,delimiter="/"
,options = document.getElementById("options")
,delay = function(){test.value = delimiter + regex.value + delimiter + options.value}
,update = function(e){
// without delay value = not updated value
window.setTimeout(delay,0);
}
regex.onkeydown = update;
options.onkeydown = update;
Walaupun ini secara teknis 'kode golf' saya akan sangat terkesan jika ada yang bisa menemukan jawaban / membuktikan itu tidak mungkin.
Tautan sekarang diperbaiki. Maaf untuk semua
Jawaban yang menang sejauh ini: jimmy23013 dengan 40 karakter
sumber
aaa
tetapi tidak / aaa ///
pembatas, atau dapatkah kita memilih pembatas lainnya (PCRE mendukung hampir semua karakter, dan khususnya Anda dapat menggunakan kurung / kurung / kurung yang cocok sebagai pembatas)."/
dan/"
Jawaban:
Rasa PCRE,
2612892101841271097153514440 byteYa itu mungkin!
Coba di sini. (Tetapi
/
ditampilkan sebagai pembatas pada Regex101.)Harap jangan melakukan pengeditan (pembaruan) yang tidak perlu pada halaman Regex101. Jika pengeditan Anda tidak benar-benar melibatkan peningkatan, mencoba atau menguji regex ini, Anda dapat memotongnya atau membuat yang baru dari beranda mereka .
Versi ini berfungsi lebih baik pada Regex101 (44 byte):
Coba di sini.
Ini jauh lebih sederhana daripada versi aslinya dan berfungsi lebih seperti quine tradisional. Mencoba mendefinisikan string tanpa menggunakannya, dan menggunakannya di tempat yang berbeda. Jadi itu dapat ditempatkan sangat dekat dengan salah satu ujung regex, untuk mengurangi jumlah karakter yang membutuhkan lebih banyak karakter untuk menentukan pola yang cocok dan diulang lebih banyak kali.
Penjelasan:
\Q^\/()(?R){2}\/\z|\1\Q
cocok dengan string^\/()(?R){2}\/\z|\1\Q
. Ini menggunakan kekhasan yang\Q...\E
tidak harus ditutup, dan pembatas yang tidak terhindar bekerja\Q
. Ini membuat beberapa versi sebelumnya hanya berfungsi pada Regex101 dan tidak secara lokal. Tapi untungnya versi terbaru berfungsi, dan saya bermain golf beberapa byte lagi menggunakan ini.\1
sebelum\Q
mencocokkan grup yang ditangkap 1. Karena grup 1 tidak ada dalam opsi ini, itu hanya dapat cocok dengan panggilan rekursif. Dalam panggilan rekursif cocok dengan string kosong.(?R){2}
memanggil seluruh regex secara rekursif dua kali, yang cocok^\/()(?R){2}\/\z|\1\Q
untuk setiap kali.()
tidak melakukan apa pun selain menangkap string kosong ke grup 1, yang memungkinkan opsi lain dalam panggilan rekursif.^\/()(?R){2}\/\z
cocok(?R){2}
dengan pembatas ditambahkan, dari awal hingga akhir. The\/
sebelum panggilan rekursif juga memastikan pilihan ini sendiri tidak cocok dalam panggilan rekursif, karena tidak akan berada di awal string.51 byte dengan ditutup
\Q...\E
:Coba di sini.
Versi asli, 188 byte
Terima kasih kepada Martin Büttner untuk bermain golf sekitar 100 byte!
Coba di sini.
Atau 210 byte tanpa
\Q...\E
:Coba di sini.
Versi yang diperluas:
Ekstensi menyukaiBackreference tidak teratur, tetapi lookahead adalah.(?=
dan\1
telah membuat apa yang disebut ekspresi "reguler" tidak lagi teratur, yang juga memungkinkan quines.Penjelasan:
\2\
di tempat\
untuk melarikan diri karakter khusus. Jika\2
cocok dengan string kosong,\2\x
(di manax
karakter khusus) cocok denganx
dirinya sendiri. Jika\2
cocok\2\
,\2\x
cocok dengan yang lolos.\2
dalam dua pertandingan grup 1 dapat berbeda di regex. Pertama kali\2
harus cocok dengan string kosong, dan yang kedua kalinya\2\
.\Q\2\)){2}.{11}$\E\/\z
(baris 1) cocok dengan 15 karakter dari akhir. Dan.{11}$
(baris 7) cocok dengan 11 karakter dari akhir (atau sebelum baris baru). Jadi pola tepat sebelum pola kedua harus cocok dengan 4 atau 3 karakter pertama dalam pola pertama, jadi\2\.\2\|\2\)\2\)
harus cocok...\2\)
atau...\2\
. Tidak boleh ada trailing newline karena karakter terakhir seharusnya)
. Dan teks yang cocok tidak mengandung yang lain)
sebelum yang paling kanan, jadi semua karakter lain harus dalam\2
.\2
didefinisikan sebagai(.2.|)
, jadi itu hanya bisa\2\
.\2
. Dan hal-hal setelah grup 1 cocok dengan 11 karakter. Jadi total panjang dua kali\2
harus tepat 3 karakter. Mengetahui\2
untuk yang kedua kali adalah 3 karakter, itu harus kosong untuk pertama kalinya.\2
literal dalam grup 1. Dengan dua kali\2
dikenal, dan beberapa karakter terakhir yang diketahui dari baris pertama, regex ini sama persis dengan satu string.Regex tanpa rekursi atau referensi, 85 byte
Seseorang mungkin berpendapat bahwa ekspresi dengan rekursi atau referensi-ulang bukanlah ekspresi "reguler" yang sesungguhnya. Tetapi ekspresi dengan hanya lookahead masih bisa hanya cocok dengan bahasa biasa, meskipun mereka mungkin jauh lebih lama jika diungkapkan oleh ekspresi reguler tradisional.
Coba di sini.
610 byte tanpa
\Q...\E
(untuk di-golf):Coba di sini.
Idenya serupa.
Ekspresi reguler dasar
Jika lookahead tidak diizinkan, yang terbaik yang bisa saya lakukan sekarang adalah:
yang cocok
Jika
{m,n}
kuantifier tidak diizinkan, tidak mungkin karena tidak ada yang hanya bisa cocok dengan satu string, dapat mencocokkan string lebih lama dari itu sendiri. Tentu saja seseorang masih dapat menemukan sesuatu\q
yang hanya cocok/\q/
, dan masih mengatakan ekspresi dengan itu secara teratur. Namun ternyata tidak ada yang seperti ini yang didukung oleh implementasi besar.sumber