RegEx-golf: cocokkan semua konten dalam sebuah string

10

Tugas Anda adalah menulis RegEx yang cocok dengan semua yang ada di dalam string.

Sebuah string didefinisikan sebagai semua yang dikelilingi oleh (tetapi tidak termasuk) dua unescaped ".

A "dapat diloloskan oleh \, yang juga dapat diloloskan lagi.

Testcases

string:  ab\c"defg\\\"hi"jkl"mn\\\\"opqrst""
matches:      ^^^^^^^^^^     ^^^^^^        ^ (the empty string)

Mencetak gol

Solusi terpendek menang.

Spesifikasi

  • Silakan tentukan rasa yang digunakan.
  • Masukan akan seimbang ".
  • Tidak akan ada \yang segera mendahului pembatas string-awal. Misalnya, Anda tidak perlu menanganiabc\"def"
Biarawati Bocor
sumber
1
Apakah akan ada \sebelum string? Sebagai contoh abc\"def".
jimmy23013
Haruskah itu cocok dengan setiap string dalam satu grup? Misalnya, dapatkah saya menulis sesuatu yang memiliki dua kecocokan abc"de", satu adalah ddan yang lainnya e?
jimmy23013
Boleh boleh saja .
Leaky Nun
Apakah akan ada string kosong?
Martin Ender
Ya, akan ada string kosong.
Leaky Nun

Jawaban:

3

PCRE, 21 20 15 19 byte

(.|^)"\K(\\.|[^"])*

Coba di sini.

Ini cocok dengan karakter (atau awal input) sebelum kutipan ganda awal dan kemudian mengatur ulang pertandingan, untuk memastikan kutipan ganda tidak dibagi dengan pertandingan lain.

PCRE, 25 23 byte

Terima kasih kepada Martin Büttner untuk bermain golf 2 byte.

(\\.|[^"])*+(?!"(?R)|$)

Coba di sini.

Penjelasan

(
    \\.|[^"]     # An escaped character, or a character that isn't a double quote
)*+              # Possessive zero-or-more quantifier, which means backtracking
                 # could not happen after first match is found. That means if \\.
                 # matched, it would never switch to [^"], because it is always a
                 # match if it just stopped after the \\. without backtracking.
(?!"(?R)|$)      # Make sure it is not followed by a double quote and another
                 # match, or the end of the input.

Perhatikan bahwa quantifier posesif ( *+) memastikan lookahead negatif selalu dimulai setelah seluruh string, atau seluruh segmen non-string.

Ada 4 kasus:

  • Pertandingan dimulai di mana saja di luar string. \\.tidak akan pernah cocok dengan kutipan ganda sesuai dengan klarifikasi. Itu hanya bisa berakhir tepat sebelum tanda kutip ganda berikutnya yang memulai string, atau akhir input. Kedua kasus gagal tampilan negatifnya.
  • Pertandingan dimulai pada awal string. (\\.|[^"])*+akan cocok dengan string yang lengkap. Karakter selanjutnya harus berupa kutipan ganda, dan tidak bisa menjadi akhir dari input. Setelah kutipan ganda itu di luar string, jadi itu tidak bisa menjadi pasangan lain. Jadi itu melewati lookahead negatif.
  • Pertandingan dimulai pada akhir string. Ini cocok dengan string kosong dengan cara yang sama seperti case sebelumnya. Tetapi tidak masalah menurut klarifikasi.
  • Pertandingan dimulai di tengah-tengah string. Tidak mungkin karena pertandingan tidak tumpang tindih.
jimmy23013
sumber
Akan (\\.|[^"])bekerja
Martin Ender
@ MartinBüttner yang cocok dengan semuanya kecuali "
Bálint
@ Bálint yang saya maksudkan ([^\\"]|\\.)bukan, sebagai solusi lengkap.
Martin Ender
@ MartinBüttner Oh, ok
Bálint
Saran Martin harus bekerja, karena \\.hanya gagal ketika tidak ada karakter setelah \(atau karakter baris baru, tetapi itu dapat diperbaiki dengan bendera), dan kasus itu ditutupi oleh pandangan negatif di belakang. Kuantitatif posesif mencegah kemunduran, jadi kami tidak punya kasus lain untuk dilihat.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
0

JavaScript, 24 byte

"([^"\\]*(?:\\.[^"\\]*)*)"

Grup 1 adalah isi string.

Siapa itu
sumber
Ini sama sekali tidak bekerja dengan tanda kutip yang lolos, dan dengan demikian gagal memenuhi spesifikasi.
ATaco
Ah ya - maaf. Bagaimana tentang itu?
Whothehellisthat
Tutup tetapi tidak ada cerutu, Anda seharusnya tidak cocok dengan "s luar
ATaco
Ya, itulah yang saya takutkan. Tidak mungkin melakukannya dalam JavaScript, saya menduga?
Whothehellisthat
Anda dapat menangkapnya dalam subkelompok
ATaco
0

JavaScript, 21 15 13 12 byte

"((\\?.)*?)"

Isi string dalam grup 1.

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
12Me21
sumber