Eşleşmeyen en kısa normal ifade


59

Göreviniz hiçbir dizginin eşleştiremeyeceği en kısa geçerli normal ifadeyi yazmak, boş dize dahil etmek.

Gönderiler bu forma sahip olmalıdır ("değişmez gösterim"):

/pattern/optional-flags

En kısa regexp kazanır. Regexp boyutu karakter olarak sayılır. (eğik çizgiler ve bayraklar dahil)

Lütfen regexp'inizin nasıl çalıştığını açıklayın (önemsiz değilse).

Teşekkürler ve eğlenin!


Bu benden bir soru ilham verdi. Yine de birkaç gün bekleyeceğim. Aynı anda aktif 2 regex soru sormak istemiyorum
Cruncher

13
Hangi uygulamaya göre “Geçerli”? Perl’in iyi olduğu eğlenceli bir tane buldum (ve bulabildiğim tek RE gramerine göre geçerli fakat bu grep ve Python’un yeniden modülünün reddetmesi.
Josh Caswell

1
Evet, hangi regex lehçeleri ? Çok farklı olanlar var.
hippietrail

1
Peki ya başkanların isimleri? xkcd.com/1313
Carl Witthoft

@CarlWitthoft Bu yarışmaya katılmak için bir program olmanız gerekiyor: codegolf.stackexchange.com/q/17718/2180
14:14

Yanıtlar:


53

6 karakter

Primo ve Peter Taylor'ın cevapları ve aşağıdakilerden bir ipucu man perlre:

/(?!)/

Bu perl uyumlu regex, boş bir dize ile eşleşir, başka bir boş dize tarafından takip edilmez.


+1 - Bu muhtemelen en yaygın olarak taşınabilir olan en kısa cevaptır (bununla birlikte /x\by/, ancak eğer gerçekten böyle bir regex kullanmak zorunda olsaydım - ne olursa olsun - o zaman bu cevap da en net cevaptır)
Martin Ender

@ m.buettner: Teşekkürler. Primo /(*FAIL)/muhtemelen daha açıktır. (Ve aslında man perlre, benim madenin gerçekte kendi iç alanına yayıldığını söyleyerek bunu geri verdi.)
Nate Eldredge

/(*FAIL)/olsa da taşınabilir değil. Ve Perl'de bile olumsuz bir bakıştan daha karanlık bir özellik olduğunu düşünüyorum.
Martin Ender

3
Bugün neredeyse tüm popüler (Perl-ilham) lezzetlerinde etrafınıza bakıyorsunuz, oysa ben bu kontrol fiillerini Perl'den başka hiçbir yerde görmedim.
Martin Ender

1
Aslında, Perl belgeleri (ve -Mre=debug) bunun Perl regex iyileştiricisi tarafından (?!)optimize edildiğini söylüyor (*FAIL)( OPFAILgöre -Mre=debug). Ayrıca, (*FAIL)Perl 5'in (ve onun adı olduğu Perl 6'nın dışında) dışında gördüğümü sanmıyorum <!>.
Konrad Borowski

39

8 karakter

/(?=a)b/

Her ikisi de olan ave baçıkça imkansız olan bir karakter içeren bir dize istiyoruz .


19
/(?!x)x/daha da imkansız görünüyor ;-)
Howard

@PeterTaylor nerede?
'.

@Lohoris, nerede?
Peter Taylor,

@PeterTaylor bahsettiğiniz o saçma kuralları nereye koydu, onları bulamadım.
'.

7
Çocuklar, seçtiğim sayım için üzgünüm, onlardan sonra gelebilecek isteğe bağlı bayraklar nedeniyle eğik çizgileri eklemenin daha kolay olacağını düşündüm.
Xem

31

5 karakter

Suistimal eden $ve ^... bu aslında Perl'de çalışan herkesin aksine :

/V\A/

\A dizenin başlangıcıyla eşleşir.


İle de çalışır ^.
Tomas


28

8 karakter

/\w\b\w/

\b'Kelime' karakterleriyle çevrili bir sözcük sınırı ( ) ( \w- biri [_a-zA-Z0-9]). Bir kelime sınırından önceki veya sonraki karakterlerden birinin 'sözcük olmayan' bir karakter olması gerektiğinden eşi benzeri bulunmaz.

Bu arada: bu eşsiz ifadeye benziyor

/\W\b\W/

burada \Wolmayan'word' karakterdir.


Kayma çizgileri /sayıldığından bu, rekabet kurallarına göre 8 karakterdir . Örneğin OP girişine bakınız . Yine de harika bir giriş!
Josh Caswell

Ayrıca , daha kısa girişlerin bazılarında uygulamaya bağlı problemler göz önüne alındığında, kazanan (veya Peter Taylor'un girişine bağlı) da olabilir !
Josh Caswell

Çok zarif! Böyle bir şey olması gerektiğini düşündüm!
Tomas, 14

22

4 karakter

/$a/

dizenin sonundan sonra bir "a" arar.

veya

/a^/

dizenin başlangıcından önce bir arama yapar.


20
İki kişilik bir çözüm olduğunu biliyorsanız neden soruyu yayınlayın?
Peter Taylor,

3
@Howard: Boş bir dize ile eşleşiyor: jsfiddle.net/RjLxJ
ProgramFOX

10
Rakipsiz bir çözüm sağlandıktan sonra neden hep bu sorunları buluyorum :(
Cruncher

43
-1: "Yasadışı" konumlara koymak ^ve $sadece sıradan karakterler olarak kabul edilmelerini sağlar. İlk örnek, değişmez maçları $aiçinde sedve muhtemelen diğer programlar.
Ben Jackson

2
@Ben Jackson, POSIX ERE'ler için doğru değil. Deneyin echo 'a^b' | grep 'a^b'vs echo 'a^b' | grep -E 'a^b'. Check out 9.4.9 ERE İfade Çapa
laindir

21

5 karakter

/$.^/

/$^/ boş bir dizeyle eşleşir, oysa aralarında bir karakter olmasını istemez.


6
Bu ne yazık ki Perl'deki ( ve belki de"$a^" yerindekilerdeki 'a') eşleşir (veya yerine herhangi bir şey ). Yine de güzel bir tane!
Josh Caswell

@JoshCaswell: Perl $., geçerli satır numarası değişkeni olarak yorumlanabilir . Hangisi boş olabilir, bu durumda bu olacaktır /^/.
MvG

'Arasında' bir karakter sadece bir karakterli bir dize anlamına gelir.
jwg

3
@jwg takasın farkına varmış ^ve$
14'te mniip

'$^'Grep ile desen denedim , ama ne yazık ki dize ile eşleşti '$^'. Smartass grep.
joeytwiddle

19

9 karakter

Emin değilim /[^\S\s]/, ancak karakter olmaması gerektiği gibi, çünkü karakterlerden biri değil, bunlardan en az biri.


İhtiyacın yok +.
Peter Taylor,

10
/ [^ \ S \ s] / = 9 karakter
xem

19

6 karakter

Yaptığım bu regex çalışacak düşünüyorum:

/\b\B/

Bir kelime sınırı ( \b) ile eşleşmeyen bir kelime ile eşleşir ( \B). Hangileridir? Bunu size açıklamak zorunda mıyım?


Bu, bir kelime sınırını izleyen bir kelime sınırı aramaz mı?
grexter89

1
@ grexter89 Evet, ancak aralarında hiçbir karakter bulunmuyor. yani sınır ve sınır olmayanlar aynı alanı kaplamalıdır.
Şapkalı Adam

2
Bunu beğendim. İyi yakalama.
primo

18

4 karakter

(Yalnızca ECMAScript tadı)

/[]/

Diğer tatlar bu geçerli bir karakter sınıfı (değil ]bir karakter olarak düşünülebilir içinde sınıfından, yani sınıf asla kapalı olduğu için ifadesi geçerli değil), fakat ECMAScript standart boş karakter sınıflarını kabul eder. Bir sınıf beri sahip bir karakteri (çok boş dizeleri eşleşmiyor) eşleşecek şekilde değil, tek bir karakter dahil edildiğinden hiçbir gerçek karakter ya eşleşir.


Bir karakterle eşleşmesi gerektiğini söylese de, bu boş bir dizeyle eşleşmez mi? Yoksa bu yasadışı olduğunu düşünüyorum: /[]{0}/. (. Kendi Yanıt kısmen sizinki gibi görünüyor olsa Ps, ben aslında benim yazdıktan sonra seninkini okuyun.)
nl-x

@ nl-x tarayıcınızın konsoluna yapıştırabilirsiniz: /[]/.test(""). yanlış döndürür. Bir karakter sınıfı, karakter içermese bile boş bir dizeyle hiçbir zaman eşleşemez ("Dizedeki bir sonraki karakter listelenirse eşleşir, eşleşir; ELSE başarısız olur" gibi uygulanırlar). /[]{0}/yasal (ECMAScript’te) ve boş dize ile eşleşiyor ... ancak bunun cevabımla ne kadar alakalı olduğundan emin değilim.
Martin Ender

Ruby 2.0 başarısız
Nakilon

Tabii @Nakilon. Ruby ECMAScript lezzetini uygulamıyor.
Martin Ender

15

6 karakter

/b++b/

İyileştirici niceleyici, olabildiğince fazla b, ardından 1 tane arar. 6 karakter ama simetri için puan?


Huh ... Yeni bir özellik öğrendim. Görünüşe göre, regex yeteneklerim çok eski değil. Teşekkürler ve +1.
Ilmari Karonen

8

6 karakter

/(\1)/

Kazanan değil, ama eğlenceli olduğunu düşündüm. grep ve Python bu konuda hem barf, ancak Perl bununla iyi görünüyor.

Öyle görünüyor çok uygulama bağımlı (pek de şaşırtıcı değil, onun garabeti verilen). Bob , JavaScript’in regex motorundaki herhangi birşeyle eşleştiğini bildirmiştir .


.NET'in regex motoru kabul ediyor gibi görünüyor.
Bob

JS'de ne girdi olursa olsun, her zaman eşleşir (boş bir dize)
Bob

8

Belki biraz aldatma, ama…

\0

POSIX regex'te hemen hemen hepsi uygulamaların tümü olmasa da eşsizdir . TEMEL RE ve GENİŞLENİLEN RE.

POSIX RE, PCRE'nin sahip olduğu sinir bozucu eğik çizgi ve bayraklara ihtiyaç duymaz.


+1 Güzel! Maalesef, taban 0PERL'de çalışmıyor. "0"=~0doğrudur ...
Tomas

tek \0ITYM? Evet, çoğu perlre (1) ve PCRE uygulamaları C dizgileri kullanmaz, ancak bu hilenin işe yaramayacağı boyuta bağlı tamponlar kullanmaz, ancak POSIX RE uygulamaları çoğu C dizgileri üzerinde çalışır.
mirabilos


5

4 karakter:

/.^/

GNU grep 2.5.1 ve egrep ile çalışır.


/.^/= 4 karakter.
Alexey Popkov,

Neden ihtiyacın var //? bunlar her yerde gerekli değildir ;-)
RSFalcon7

Kaydırma çizgileri /sayılır, orijinal soruya ("eğik çizgiler ve bayraklar dahil") ve OP'nin girişine bakın .
Alexey Popkov,

sağ! Okumayı özledim :(
RSFalcon7

Hayır, aşağıdaki ile aynı sebepten dolayı: Aslında, “^” sadece desenin başındaysa özeldir. Herhangi bir şeyden sonra herhangi bir “^” kaçması gerekmez, bu nedenle bu cevap yanlıştır.
mirabilos

4

Perl 6 (5 karakter)

/<!>/

Sorta kuralının kötüye kullanılması (çünkü Perl 6 regex'leri farklı ve tasarım açısından stardard regex'lerle uyumlu değiller), ama umrumda değil. <!>kural Perl 6'ya regex'in eşleşmediğini bildirir.


4

6 bayt

/(*F)/

(*FAIL)Perl ile karşılaştırılabilir regex motorların desteklediği bir kısaltma . Bu işaret için @HamZa teşekkürler .

9 bayt

/(*FAIL)/

Fiilleri destekleyen herhangi bir regex motoru ile çalışmalı. Bunun gerçekten daha fazla golf oynaması gerektiğine ikna olmadım.


1
Bu nasıl çalışıyor?
14'te kabin

@boothby (*FAIL)her zaman başarısız olan bir fiildir.
primo

@primo sadece kullanabilirsiniz /(*F)/:)
HamZa

4

4 karakter

/$./

Dize bittikten sonra herhangi bir karakter gerekiyor


Diğerlerine benzer şekilde, $sadece desenin sonunda özeldir.
mirabilos

3

4 eğik çizgi ile 2 olmadan

TXR dilinin regex motorunda, boş bir karakter sınıfı []karakter yok, dolayısıyla karakter yok. Bu şekilde davranır, çünkü karakter sınıfı bir karakter eşleşmesi gerektirir ve boş olduğunda hiçbir karakterin onu tatmin edemeyeceğini belirtir.

Bir başka yolu regex "boş dahil tüm dizeleri seti" ters etmektir /.*/tamamlayıcı operatörü kullanılarak: /~.*/. Bu kümenin tamamlayıcısı hiç dizge içermiyor ve hiçbir şeyle eşleşemiyor.

Bunların hepsi man sayfasında belgelenmiştir:

   nomatch
          The  nomatch  regular  expression  represents  the empty set: it
          matches no strings at all, not even the empty string.  There  is
          no  dedicated  syntax  to  directly express nomatch in the regex
          language.  However, the empty character class []  is  equivalent
          to nomatch, and may be considered to be a notation for it. Other
          representations of nomatch are possible: for instance, the regex
          ~.* which is the complement of the regex that denotes the set of
          all possible strings, and thus denotes the empty set. A  nomatch
          has  uses;  for instance, it can be used to temporarily "comment
          out" regular expressions. The regex ([]abc|xyz) is equivalent to
          (xyz), since the []abc branch cannot match anything. Using [] to
          "block" a subexpression allows you to leave it  in  place,  then
          enable it later by removing the "block".

Eğik çizgiler, kendi başına regex sözdiziminin bir parçası değildir; bunlar sadece S-ifade notasyonundaki regex'leri sınırlayan noktalama işaretleridir. Tanıklık, tanık olmak, şahit olmak:

# match line of input with x variable, and then parse that as a regex
#
$ txr -c '@x
@(do (print (regex-parse x)) (put-char #\newline))' -
ab.*c                               <- input from tty: no slashes.
(compound #\a #\b (0+ wild) #\c)    <- output: AST of regex

Cevabınız için teşekkürler ve eğik çizgi için tekrar özür dilerim. İnsanlar bayrak kullanırsa onları dahil etmenin daha kolay olacağını düşündüm.
xem

1

6 karakter

(veya 4, nasıl baktığınıza bağlı olarak)

/{,0}/

Ruby 2.0
Nakilon'da

Hangi regex uygulamalarında bu bir hata vermez?
Peter Taylor,

Sadece PHP'nin preg_match komutunu kullanarak test ettim.
Tercy

1

Bu 5 karakterli bir regex.

/[]+/

Boş bir grup 1 veya daha fazla kez eşleştirir.

DÜZENLE:

Diğer tatlar için cevabım kaldırıldı:

/.{-1}/

{} İçindeki sayı olmayan herhangi bir şey metinle eşleşir.

Bu, ". {- 1}" ile eşleşecek


Bunun yalnızca ECMAScript lezzetinde çalıştığını unutmayın. Çoğu (hepsinde?) Diğerlerinde ise geçerli bir ifade değildir.
Martin Ender,

Geçersiz değil mi?
Wasi

@WAS, ECMAScript ile uyumlu tatlarda değil
Martin Ender,

0

5 karakter

Umarım bu aptalca gelmiyor: /[]+/


Hayır! Geçerli bir regex değil.
Şapkalı Adam

@RyanCarlson Geçerli ve yasal ... En azından Ecmascript'te.
nl-x

-1
/$^/

Başlamadan önce biten bir şey ...


7
Boş dizgiyi eşleştirir (bazı RE uygulamalarında, yine de).
Josh Caswell

1
Uygulaman bozuldu :)
simon

2
Guido'ya bildirse iyi olur .
Josh Caswell

7
Daha da önemlisi, Ben Jackson işaret eşleşmiyor nerede, Perl, ""bu mu bu iki değişmez karakterleri içeren bir dize maç: "$^".
Josh Caswell

+1 Ben de aynısını göndermek istedim! @Josh, PERL'de çalışıyor ve boş dize ile eşleşmiyor! Ben'in yorumu bozuldu, cevap verdim.
Tomas
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.