Ekspresi reguler pencocokan silang

21

Tugas Anda di sini adalah menulis dua ekspresi reguler, yang masing-masing cocok dengan yang lain tetapi tidak cocok dengan dirinya sendiri.

Kedua ekspresi reguler harus memiliki bentuk ini:

/pattern/optional-flags

Ini juga bentuk di mana mereka harus dicocokkan.

Solusi terpendek menang. Panjang solusi dihitung sebagai jumlah karakter dalam kedua ekspresi reguler termasuk garis miring dan bendera.

Gunakan standar sintaksis regex pilihan Anda, atau tentukan bahasa pemrograman, ketika itu membuat perbedaan.

Selamat bersenang-senang!

GOTO 0
sumber
Apakah regex juga harus cocok dengan garis miring dan bendera regex lainnya?
ProgramFOX
@ProgramFOX ya, saya menambahkan baris untuk membuatnya jelas.
GOTO 0
Bisakah Anda mendefinisikan kecocokan? yaitu apakah regex /a/cocok abc?
The Guy with The Hat
2
@TheGuywithTheHat baik, saya pikir begitu, kecuali jika Anda memilih bahasa yang memberlakukan batasan tertentu, seperti kebutuhan untuk mencocokkan seluruh string. Apakah ini menjawab masalah Anda?
GOTO 0
1
Untuk menjadi jelas: Saya berasumsi bahwa penggunaan pembatas yang berbeda (sebagaimana diizinkan oleh misalnya PHP PCRE) tidak diizinkan? (Yaitu tidak mengirimkan /^%/dan %^/%)
Peter Taylor

Jawaban:

7

PRCE dengan pengubah A: 9 karakter

/A$/
/.A/A

Meskipun ini merupakan varian dari /modifier$/jawaban Doorknob , saya pikir inovasi ini memenuhi syarat sebagai jawaban yang terpisah dan bukan komentar atas jawabannya: pengubah melakukan tugas ganda. Alih-alih berada di sana hanya untuk regex lain untuk mencocokkan, itu jangkar.

Regex pertama cocok dengan string apa pun yang berakhir dengan literal A. Regex kedua cocok dengan string apa pun yang karakter keduanya adalah literal A, menggunakan bendera jangkar untuk memulai.

Demo online

Peter Taylor
sumber
3
Untuk mengalahkan ini diperlukan hanya empat karakter non-pembatas, dan karena //cocok dengan apa pun yang berarti bahwa masing-masing regex dapat memiliki paling banyak tiga karakter non-pembatas. Menggunakan PHP PCRE terdapat 73339 regex yang tidak cocok dengan diri sendiri dalam batasan itu, dan pemeriksaan lengkap dari pasangan yang panjangnya kurang dari 10 (pada urutan 32Mpairs daripada 5.7Gpairs karena kebanyakan dari mereka 5 chars termasuk pembatas) muncul. solusi ini dan tidak ada yang lain. Karena itu saya mengklaim bahwa itu optimal untuk mesin regex tertentu.
Peter Taylor
18

4 + 6 = skor 10

Regex pertama:

/i$/

Regex kedua:

/^.i/i

Hore untuk penyalahgunaan bendera! :-P

Yang pertama cocok dengan apa pun yang berakhir dengan i(oleh karena itu, setiap regex dengan ibendera).

Yang kedua cocok dengan karakter kedua i.

Versi alternatif: /i$/gdan /g$/i.

Gagang pintu
sumber
3
Variasi lain adalah /x.$/dan /^.x/untuk sekelompok x
shiona
Atau /i$/dan/\/$/i
Peter Taylor
Atau /i$/dan/i\$/i
Peter Taylor
6

Regex JavaScript, skor: 18

Regex pertama:

/^[^a]+$/

Regex kedua:

/^[^b]+$/

Tes JavaScript:

var regex1 = "/^[^a]+$/";
var regex2 = "/^[^b]+$/";
alert(/^[^a]+$/.test(regex2)); // true: regex1 matches regex2
alert(/^[^b]+$/.test(regex1)); // true: regex2 matches regex1
alert(/^[^a]+$/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^b]+$/.test(regex2)); // false: regex2 doesn't match regex2

Tes online: http://jsfiddle.net/99Sx6/

ProgramFOX
sumber
5

Ruby regex, 15

Ekspresi reguler:

/.{9}/
/^.{06}$/

Hanya menghitung karakter ...

Versi online

r1 = '/.{9}/'
r2 = '/^.{06}$/'

p r1 =~ /^.{06}$/ #0:   r2 matches r1
p r2 =~ /.{9}/    #0:   r1 matches r2
p r1 =~ /.{9}/    #nil: r1 doesn't match r1
p r2 =~ /^.{06}$/ #nil: r2 doesn't match r2
David Herrmann
sumber
5

4 + 6 = 10

Regex pertama:

/i$/

Regex kedua:

/\/$/i

i$cocok dengan sesuatu yang berakhir dengan i, yang kedua. /$cocok dengan sesuatu yang berakhir dengan /, yang pertama.

Justin
sumber
2
Duplikat komentar yang saya poskan ke jawaban Doorknob.
Peter Taylor
@PeterTaylor Tidak memperhatikan komentar sampai sekarang. Ini adalah penemuan independen.
Justin
Ya, saya secara mandiri menemukan versi shiona juga.
Peter Taylor
3

5 + 5 = 10

Regex # 1:

/0.$/

Regex # 2:

/^.0/

The 0s di kedua regexes bisa diganti dengan non-metakarakter dan regex masih bekerja.

0.$cocok dengan apa pun yang karakter terakhir kedua adalah 0, dan ^.0cocok dengan apa pun yang karakter kedua adalah 0.

Justin
sumber
2
Pasangan pertama bukan regex yang valid: Anda harus melarikan diri dari /es. Alternatifnya adalah penipuan komentar pada jawaban Doorknob.
Peter Taylor
2

Regex JavaScript, skor: 13

Regex pertama:

/\d/

Regex kedua:

/^[^0]+$/

Penjelasan: regex pertama cocok dengan semua yang mengandung digit, dan regex kedua cocok dengan semua yang tidak mengandung a 0.

Tes JavaScript:

var regex1 = "/\d/";
var regex2 = "/^[^0]+$/";
alert(/\d/.test(regex2)); // true: regex1 matches regex2
alert(/^[^0]+$/.test(regex1)); // true: regex2 matches regex1
alert(/\d/.test(regex1)); // false: regex1 doesn't match regex1
alert(/^[^0]+$/.test(regex2)); // false: regex2 doesn't math regex2

Tes online: http://jsfiddle.net/5VYjC/1/

ProgramFOX
sumber
2

12 karakter ;) JS regex

/\d/
/0?\/$/g
Andrew Templeton
sumber
2

Nilai: 5 + 5 = 10

Butuh waktu setengah jam untuk mencari tahu tapi saya benar-benar senang saya melakukannya :)

1 adalah: /j.$/

2 adalah: /^.j/

Yang pertama cocok dengan yang jterjadi di posisi kedua mulai dari kanan. 2 cocok dengan yang jterjadi di posisi kedua mulai dari kiri.

Saya belum menguji tetapi saya berpikir bahwa RegExs ini benar-benar serbaguna karena jdapat diganti dengan \wkarakter apa pun (atau lebih?) Dan masih harus berfungsi dengan baik.

PS Ini seharusnya (semoga) bekerja dalam bahasa apa pun. Padahal, jika tidak berhasil, tolong informasikan di komentar di bawah ini :)

Uji

Gaurang Tandon
sumber
Dan saya tahu sekarang bahwa @Quiccunx telah memposting versi yang sama seperti milik saya. Saya benar-benar minta maaf Quiccunx dan jika mau, saya akan menghapus jawaban saya.
Gaurang Tandon
1

PCRE menggunakan pengubah x: 11 karakter

/\s/
/ s.$/x

Yang pertama cocok dengan string apa pun dengan karakter spasi, tetapi tidak mengandung spasi. Yang kedua berisi spasi putih, tetapi diabaikan karena xpengubah; cocok dengan string apa pun yang karakter kedua dari belakangnya s.

PCRE dan mesin lainnya menggunakan kelas karakter: 11 karakter

/\w+w/
/\Ww/

Yang pertama cocok dengan string apa pun dengan karakter "kata" (huruf, angka, garis bawah) diikuti oleh literal w; yang kedua cocok dengan sembarang string dengan karakter non-kata diikuti oleh literal w.

PCRE dan mesin lainnya menggunakan kelas karakter dan anchor batas kata: 11 karakter

/\w\w/
/\bw/

Yang pertama cocok dengan sembarang string dengan dua karakter "kata" berturut-turut; string kedua dengan karakter non-kata atau string awal diikuti dengan literal w.

Peter Taylor
sumber
-1

ECMAScript (11 byte):

/^\1?d/
/\d/

Mesin REGEXP Lainnya (14 byte):

/^\\\\1?d/
/\d/

Tanggal 1 cocok dengan \ d [..] atau \ 1d [..].

Yang kedua cocok dengan sembarang string dengan angka.

EDIT:

Awalnya, jawaban ini diposting karena kompatibel dengan semua mesin, tetapi terbukti salah.

Ada masalah dengan referensi ke grup penangkap (misalnya, dalam php).

Ismael Miguel
sumber
Banyak mesin regex mengambil regex tanpa garis miring di sekitarnya, tetapi pertanyaannya cukup jelas dalam mengharuskan mereka untuk dihitung.
Peter Taylor
Saya tidak menghitungnya sebagai jawaban. Biarkan saya menambahkan catatan untuk itu.
Ismael Miguel
1
@PeterTaylor saya menambahkan catatan. Versi Apache ada hanya karena.
Ismael Miguel
Tunggu dulu: di mesin apa mesin parse pertama \1tidak diartikan sebagai referensi belakang?
Peter Taylor
Tergantung cara Anda menggunakannya. Dalam php, misalnya, jika Anda memasukkan ke dalam "/^\1?d/"Anda akan mengalami masalah, tetapi jika Anda melakukannya '/^\1?d/', maka tidak apa-apa. Kutipan membuat perbedaan besar ketika kode ditafsirkan.
Ismael Miguel