Rasa PCRE, 261 289 210 184 127 109 71 53 51 44 40 byte
Ya itu mungkin!
<^<()(?R){2}>\z|\1\Q^<()(?R){2}>\z|\1\Q>
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):
/^\/()(?R){2}\/\z|\1\Q^\/()(?R){2}\/\z|\1\Q/
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
:
/\QE\1|^\/(\\)Q(?R){2}z\/\E\1|^\/(\\)Q(?R){2}z\/\z/
Coba di sini.
Versi asli, 188 byte
Terima kasih kepada Martin Büttner untuk bermain golf sekitar 100 byte!
/^(?=.{173}\Q\2\)){2}.{11}$\E\/\z)((?=(.2.|))\2\/\2\^\2\(\2\?=\2\.\2\{173}\2\\Q\2\\2\2\\\2\)\2\)\2\{2}\2\.\2\{11}\2\$\2\\E\2\\\2\/\2\\z\2\)\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\)){2}.{11}$/
Coba di sini.
Atau 210 byte tanpa \Q...\E
:
/^(?=.{194}\\2\\.\)\{2}\.\{12}\$\/D$)((?=(.2.|))\2\/\2\^\2\(\2\?=\2\.\2\{194}\2\\\2\\2\2\\\2\\\2\.\2\\\2\)\2\\\2\{2}\2\\\2\.\2\\\2\{12}\2\\\2\$\2\\\2\/D\2\$\2\)\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\)){2}.{12}$/D
Coba di sini.
Versi yang diperluas:
/^(?=.{173}\Q\2\)){2}.{11}$\E\/\z) # Match things near the end.
((?=(.2.|)) # Capture an empty string or \2\ into group 2.
\2\/\2\^\2\(\2\?=\2\.\2\{173}\2\\Q\2\\2\2\\\2\)\2\)\2\{2}\2\.
\2\{11}\2\$\2\\E\2\\\2\/\2\\z\2\) # 1st line escaped.
\2\(\2\(\2\?=\2\(\2\.2\2\.\2\|\2\)\2\) # 2nd line escaped.
){2}
.{11}$/x
Ekstensi menyukai (?=
dan \1
telah membuat apa yang disebut ekspresi "reguler" tidak lagi teratur, yang juga memungkinkan quines. Backreference tidak teratur, tetapi lookahead adalah.
Penjelasan:
- Saya menggunakan
\2\
di tempat \
untuk melarikan diri karakter khusus. Jika \2
cocok dengan string kosong, \2\x
(di mana x
karakter khusus) cocok dengan x
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\
.
- Baris pertama membuat seluruh ekspresi cocok dengan 188 karakter karena semuanya memiliki panjang tetap. Dua kali grup 1 cocok dengan 45 * 2 karakter plus 29 kali
\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.
- Semuanya kecuali lookahead dan
\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.
- Martin Büttner datang dengan ide menggunakan lookahead untuk menangkap grup 2 dan membuatnya tumpang tindih dengan bagian quine. Ini menghapus karakter yang tidak lolos dengan cara normal antara dua kali grup 1, dan membantu menghindari pola yang cocok dengan mereka dalam versi asli saya, dan banyak menyederhanakan regex.
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.
/(?=.*(\QE\\){2}z\/\z)^\/\(\?\=\.\*\(\\Q.{76}\E\\){2}z\/\z)^\/\(\?\=\.\*\(\\Q.{76}\z/
Coba di sini.
610 byte tanpa \Q...\E
(untuk di-golf):
/^(?=.{610}$)(?=.{71}(\(\.\{8\}\)\?\\.[^(]*){57}\)\{2\}\.\{12\}\$\/D$)((.{8})?\/(.{8})?\^(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{610(.{8})?\}(.{8})?\$(.{8})?\)(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{71(.{8})?\}(.{8})?\((.{8})?\\(.{8})?\((.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{8(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\?(.{8})?\\(.{8})?\\(.{8})?\.(.{8})?\[(.{8})?\^(.{8})?\((.{8})?\](.{8})?\*(.{8})?\)(.{8})?\{57(.{8})?\}(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\{2(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{12(.{8})?\\(.{8})?\}(.{8})?\\(.{8})?\$(.{8})?\\(.{8})?\/D(.{8})?\$(.{8})?\)(.{8})?\(){2}.{12}$/D
Coba di sini.
Idenya serupa.
/^(?=.{610}$)(?=.{71}(\(\.\{8\}\)\?\\.[^(]*){57}\)\{2\}\.\{12\}\$\/D$)
((.{8})?\/(.{8})?\^(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{610(.{8})?\}(.{8})?\$(.{8})?\)
(.{8})?\((.{8})?\?=(.{8})?\.(.{8})?\{71(.{8})?\}
(.{8})?\((.{8})?\\(.{8})?\((.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{8(.{8})?\\(.{8})?\}
(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\?(.{8})?\\(.{8})?\\
(.{8})?\.(.{8})?\[(.{8})?\^(.{8})?\((.{8})?\](.{8})?\*(.{8})?\)(.{8})?\{57(.{8})?\}
(.{8})?\\(.{8})?\)(.{8})?\\(.{8})?\{2(.{8})?\\(.{8})?\}
(.{8})?\\(.{8})?\.(.{8})?\\(.{8})?\{12(.{8})?\\(.{8})?\}
(.{8})?\\(.{8})?\$(.{8})?\\(.{8})?\/D(.{8})?\$(.{8})?\)(.{8})?\(){2}.{12}$/D
Ekspresi reguler dasar
Jika lookahead tidak diizinkan, yang terbaik yang bisa saya lakukan sekarang adalah:
/\\(\\\(\\\\){2}/
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.