Misi Anda adalah menulis ekspresi reguler terpendek yang tidak ada string yang cocok, termasuk string kosong.
Kiriman harus memiliki formulir ini ("notasi literal"):
/pattern/optional-flags
Kemenangan regexp terpendek. Ukuran regexp dihitung dalam karakter. (termasuk garis miring dan bendera)
Tolong jelaskan cara kerja regexp Anda (jika tidak sepele)
Terima kasih, dan bersenang-senanglah!
Jawaban:
6 karakter
Mengikuti jawaban primo dan Peter Taylor, dan sebuah petunjuk dari
man perlre
:/(?!)/
Regex yang kompatibel dengan perl ini cocok dengan string kosong yang tidak diikuti oleh string kosong lainnya.
sumber
/x\by/
, tetapi jika saya benar-benar harus menggunakan regex seperti ini - untuk alasan apa pun - maka jawaban ini juga yang paling jelas)/(*FAIL)/
mungkin lebih jelas. (Dan benar-benarman perlre
memberikannya dengan menyebutkan bahwa milik saya benar-benar meluas ke internalnya.)/(*FAIL)/
meskipun tidak portabel. Dan bahkan di Perl, saya pikir itu fitur yang lebih jelas daripada tampilan negatif.-Mre=debug
) mengatakan bahwa(?!)
ini dioptimalkan(*FAIL)
oleh Perl regex optimizer (OPFAIL
menurut-Mre=debug
). Juga, saya tidak berpikir saya melihat di(*FAIL)
luar Perl 5 (dan Perl 6, di mana namanya<!>
).8 karakter
Kami memerlukan string berisi karakter yang keduanya
a
danb
, yang jelas tidak mungkin.sumber
/(?!x)x/
terlihat lebih mustahil ;-)5 karakter
Tidak seperti semua orang yang menyalahgunakan
$
dan^
... ini benar-benar berfungsi di Perl:\A
cocok dengan awal string.sumber
^
.6 karakter
Berdasarkan jawaban Sven Hohenstein .
sumber
8 karakter
Batas kata (
\b
) dikelilingi oleh karakter 'kata' (\w
- salah satu[_a-zA-Z0-9]
). Ini tidak cocok karena salah satu karakter sebelum atau mengikuti batas kata harus bukan karakter 'kata'.Ngomong-ngomong: ini mirip dengan ekspresi yang tak tertandingi
di mana
\W
berarti karakter non-'kata'.sumber
/
dihitung. Lihat entri OP, misalnya . Itu entri yang bagus!4 karakter
mencari "a" setelah akhir string.
atau
mencari sebelum string.
sumber
^
dan$
dalam posisi "ilegal" hanya menyebabkan mereka diperlakukan sebagai karakter biasa. Contoh pertama Anda sesuai dengan literal$a
dalamsed
dan mungkin program lain.echo 'a^b' | grep 'a^b'
vsecho 'a^b' | grep -E 'a^b'
.. Lihatlah 9.4.9 ERE Expression Anchoring5 karakter
/$.^/
/$^/
akan cocok dengan string kosong, sedangkan yang membutuhkan karakter di antara tidak akan.sumber
"$a^"
(atau apa pun di tempat'a'
) di Perl ( dan mungkin sed ). Tapi tetap saja bagus!$.
sebagai variabel nomor baris saat ini. Yang mungkin kosong, dalam hal ini akan menjadi/^/
.^
dan$
'$^'
dengan grep, tetapi sayangnya itu cocok dengan string'$^'
. Grep smartass.9 karakter
Saya tidak yakin tetapi
/[^\S\s]/
harus tidak cocok karena itu berarti bukan karakter apa pun, tetapi setidaknya salah satunya.sumber
+
.6 karakter
Saya pikir regex yang saya buat ini akan berfungsi:
Ini cocok dengan batas kata (
\b
) yang bukan batas kata (\B
). Yang mana mustahil - apakah saya benar-benar harus menjelaskan ini kepada Anda?sumber
4 karakter
(Khusus ECMAScript)
Dalam rasa lain ini bukan kelas karakter yang valid (
]
akan dianggap sebagai karakter di kelas, jadi ekspresi tidak valid, karena kelas tidak pernah ditutup), tetapi standar ECMAScript menerima kelas karakter kosong. Karena ini adalah kelas, ia harus cocok dengan satu karakter (jadi string kosong tidak cocok), tetapi karena tidak satu karakter dimasukkan, tidak ada karakter aktual yang akan cocok.sumber
/[]{0}/
. (Mz. Meskipun jawaban saya sebagian mirip dengan jawaban Anda, saya benar-benar membaca jawaban Anda setelah menulis milik saya.)/[]/.test("")
. mengembalikan salah. kelas karakter tidak pernah dapat mencocokkan string kosong, bahkan jika itu tidak mengandung karakter (saya membayangkan mereka diimplementasikan seperti "JIKA karakter berikutnya dalam string adalah salah satu yang terdaftar, cocok; ELSE gagal")./[]{0}/
legal (dalam ECMAScript) dan tidak cocok dengan string kosong ... namun, saya tidak yakin bagaimana itu relevan dengan jawaban saya.6 karakter
Possessive quantifier mencari sebanyak mungkin b, lalu 1 lagi. 6 karakter tetapi poin untuk simetri?
sumber
6 karakter
Bukan pemenang, tapi saya pikir itu menyenangkan. grep dan Python sama-sama muntah dalam hal ini, tetapi Perl tampaknya tidak keberatan.
Tampaknya sangat tergantung pada implementasi (yang tidak mengejutkan, mengingat keanehannya). Bob melaporkan di bawah bahwa itu cocok dengan apa pun di mesin regex JavaScript.
sumber
Mungkin sedikit curang, tapi ...
... tidak ada bandingannya dalam POSIX regex di hampir semua, jika tidak semua, implementasi. RE DASAR dan RE yang DIPERPANJANG, bahkan.
Dan POSIX RE tidak perlu garis miring dan bendera yang dimiliki PCRE.
sumber
0
tidak bekerja di PERL."0"=~0
itu benar ...\0
ITYM? Ya, sebagian besar implementasi perlre (1) dan PCRE tidak menggunakan string C tetapi buffer ukuran-terikat, di mana trik ini tidak akan berfungsi, tetapi sebagian besar implementasi POSIX RE bekerja pada string C.5 karakter
Cocokkan string yang dimulai dengan karakter tunggal apa pun sebelum string dimulai.
sumber
".^"
re.findall(r'^.^', '.^', re.DEBUG)
^
dan.
bukan metacharacters yang literal, yang perlu untuk melarikan diri4 char:
Bekerja dengan GNU grep 2.5.1 dan egrep.
sumber
/.^/
= 4 karakter.//
? itu tidak diperlukan di mana-mana ;-)/
dihitung, lihat pertanyaan asli ("termasuk garis miring dan bendera") dan entri OP .Perl 6 (5 karakter)
Penyalahgunaan aturan sorta (karena reg 6 Perl berbeda, dan tidak kompatibel dengan regard stardard menurut desain), tapi saya tidak peduli.
<!>
aturan menginformasikan Perl 6 bahwa regex tidak cocok.sumber
6 byte
Singkatan untuk
(*FAIL)
, didukung oleh mesin regex perl-compatable. Terima kasih kepada @HamZa karena menunjukkan ini.9 byte
Harus bekerja dengan mesin regex yang mendukung kata kerja sama sekali. Saya tidak yakin ini benar-benar perlu golf lebih jauh.
sumber
(*FAIL)
adalah kata kerja yang selalu gagal./(*F)/
:)4 karakter
Membutuhkan karakter apa pun setelah string berakhir
sumber
$
hanya khusus di akhir pola.4 karakter dengan garis miring 2 tanpa
Di mesin regex bahasa TXR, kelas karakter kosong
[]
tidak cocok dengan karakter, dan karenanya tidak ada string. Ini berlaku seperti ini karena kelas karakter memerlukan kecocokan karakter, dan ketika kosong itu menentukan bahwa tidak ada karakter yang bisa memuaskannya.Cara lain adalah dengan membalikkan "himpunan semua string termasuk kosong" regex
/.*/
menggunakan operator komplemen:/~.*/
. Komplemen set itu tidak mengandung string sama sekali, sehingga tidak dapat menandingi apa pun.Ini semua didokumentasikan di halaman manual:
Garis miring bukan bagian dari sintaks regex per se; mereka hanya tanda baca yang membatasi regex dalam notasi S-ekspresi. Saksi:
sumber
6 karakter
(atau 4, tergantung pada bagaimana Anda melihatnya)
sumber
Ini adalah regex 5 char.
Ini cocok dengan grup kosong 1 kali atau lebih.
SUNTING:
Menghapus jawaban saya untuk rasa lain:
Apa pun yang bukan angka di dalam {} akan cocok dengan teks.
Yang ini akan cocok dengan ". {- 1}"
sumber
5 karakter
Semoga ini tidak terdengar bodoh:
/[]+/
sumber
Suatu hal yang berakhir sebelum dimulai ...
sumber
""
, itu tidak cocok dengan string yang berisi dua karakter literal:"$^"
.