RegEx-golf: bir dizedeki tüm içeriklerle eşleşir


10

Senin görevin dizeler içindeki her şeyi eşleşen bir RegEx yazmaktır.

Bir dize, kaçmayan iki ile çevrelenen (ancak içermeyen) her şey olarak tanımlanır ".

A "da kaçabilir \, bu da tekrar kaçabilir.

testcases

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

puanlama

En kısa çözüm kazanır.

gözlük

  • Lütfen kullanılan lezzeti belirtin.
  • Giriş dengeli olacaktır ".
  • \Bir dizgi-başlangıç-sınırlayıcısının hemen önünde hiç kimse olmayacaktır . Örneğin,abc\"def"

1
\Bir dizeden önce olacak mı? Örneğin abc\"def".
jimmy23013

Bir gruptaki her dizeyle eşleşmeli mi? Örneğin, iki maç olan bir şey yazabilirim abc"de"biridir dve diğeri e?
jimmy23013

İzin verilir.
Sızan Rahibe

Boş teller olacak mı?
Martin Ender

Evet, boş dizeler olacak.
Sızan Rahibe

Yanıtlar:


3

PCRE, 21 20 15 19 bayt

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

Burada deneyin.

Bu, çift çift tırnak işareti başlamadan önce bir karakterle (veya girişin başlangıcıyla) eşleşir ve ardından çift tırnak işareti başka bir eşleşmeyle paylaşılmadığından emin olmak için eşleşmeyi sıfırlar.

PCRE, 25 23 bayt

2 bayt golf oynadığı için Martin Büttner'a teşekkürler.

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

Burada deneyin.

açıklama

(
    \\.|[^"]     # 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.

Sahip olunan nicelik belirtecinin ( *+), her zaman bir dizgiden ya da dizgisiz bir parçanın tamamından sonra negatif görünümün başlamasını sağladığını unutmayın .

4 vaka var:

  • Eşleşme bir dizenin dışında herhangi bir yerde başlar. \\.açıklamaya göre asla çift tırnak ile eşleşmez. Bir dizgiyi başlatan bir sonraki çift tırnaktan veya girdinin bitiminden hemen önce sona erebilir. Her iki dava da negatif ileriye doğru başarısız oluyor.
  • Maç bir dizenin başında başlar. (\\.|[^"])*+tam bir dizeyle eşleşir. Bir sonraki karakter çift tırnak olmalı ve girişin sonu olamaz. Çift alıntıdan sonra dize dışında, bu yüzden başka bir eşleşme olamazdı. Böylece negatif ileriye doğru geçer.
  • Maç bir dizenin sonunda başlar. Boş bir dize ile önceki durumla aynı şekilde eşleşir. Ancak açıklamaya göre önemli değil.
  • Maç bir dizenin ortasında başlar. İmkansız çünkü maçlar çakışmıyor.

Çalışır mıydı (\\.|[^"])?
Martin Ender

@ MartinBüttner "
Bálint

@ Bálint Demek istediğim ([^\\"]|\\.), tam bir çözüm olarak değil.
Martin Ender

@ MartinBüttner Oh, ok
Bálint

Martin'in önerisi işe yaramalı, çünkü \\.sadece sonradan bir karakter \yoksa (ya da yeni çizgi karakteri, ancak bayrakla sabitlenebilir) başarısız olur ve bu durum olumsuz bakışla kapsanır. İyelik niceliği geri izlemeyi önler, bu yüzden bakmamız gereken başka bir durum yoktur.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳


0

JavaScript, 21 15 13 12 bayt

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

Dize içeriği grup 1'de.

"   #start of string
(    #capturing group
 (
  \\?. #match character or escaped character
 )*?  #match as few as possible
)        
"   #end of string
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.