Bileşik faizinin ters regex'i


9

Koronkorko , bileşik ilgi anlamına gelen Fince sözcüktür . Dizelerimize bileşik ilgi istemiyoruz, bu yüzden onu hariç tutmak için mümkün olan en kısa düzenli ifadeyi bulalım.

Yalnızca AZ büyük harfli alfabetik karakterlerden oluşan bir dize verildiğinde, alt dizeyi içermiyorsa dizeyle eşleşen mümkün olan en kısa düzenli ifadeyi belirleyin KORONKORKO. Alt dize KORONKORKOolarak içeren hiçbir dize normal ifade ile eşleştirilmemelidir.

Sadece karakterler A- Z, [, ], -, ^, , ?, *, +, |, (, ve )ifadede kullanılmalıdır.

Bence bu ifadedeki 118 karakterle yapılabilir. Kısaltabilir misin?

Not: Bu zorluk Ohjelmointiputka'dan (Fince) kaynaklanmaktadır.


!İzin verilen bir karakter olsaydı , ^((?!KORONKORO).)*$19 bayt için yapabilirdin.
Mama Fun Roll

3
@MamaFunRoll Bence bu yüzden ! izin verilmiyor.
Alex A.

Fince sitede dolaşmaya çalışmaktan keyif aldım ve aradığınız şeyin giriş dizesiyle eşleşen / reddeden teorik regex ifadeleri olduğuna inanıyorum. Örneğin, site yalnızca karakter sınıflarının -ve ^içindeki sınıfların kullanımına izin veriyor gibi görünüyor (bu nedenle ^bir çapa olarak kullanılamaz) ve bir eşleşme yalnızca tüm dize normal ifade ile eşleşirse sayılır (ör. ^$, herhangi bir parçası normal
ifadeyle

Bu nedenle, PCRE cevabımı sildim, PHP'de bile çalışacak olsa da, bu durumda neredeyse kesinlikle istenmiyor.
Sp3000

Site ifade PHP'nin ereg işlevi tarafından geçerli olup olmadığını kontrol etmeyi unutmuşum. Bu tartışma ohjelmointiputka.net/keskustelu/… '
konuk

Yanıtlar:


6

204 karakter

(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?[^KO]|[^KR])|[^KO])|[^K])|[^KN])|[^KO])|[^KR])|[^KO])|[^K])*(K((O(R(O(NKORO)*(NK(O(RK)?)?)?)?)?)?K)*(O(R(O(NKORO)*(N(K(O(RK?)?)?)?)?)?)?)?)?

Çevirerek Oluşturulan .*KORONKORKO.*, sonlu durum makinesi içine sonlu durum makinesi ters çevirerek ve bir regex haline getirmek.


Bu neden en iyi cevap oldu?
Bálint

1

Python, 77 79 97 118 bayt

Düzenleme 3: Yeniden yaz. Yuvalanmış gözetleme uçlarını kullanır

^([^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^O]|O(?=$|[^N]|N(?=$|[^K]|K(?=$|[^O]|O(?=$|[^R]|R(?=$|[^K]|K(?=$|[^O]))))))))))*$

Normal ifade 101

Düzenleme 2: '$ |' eklendi normal ifade boyunca. Şimdi, KORONKORKO öneki eşleştirildiyse, eşleştirilecek bir sonraki öğe dize sonu, öneki sona eren bir karakter veya öneki sona eren bir şey izliyorsa öneki genişleten bir karakterdir.

Bu normal ifade re.fullmatch(), Python 3.4'e eklenen çalışır . Kullanmak için re.match(), ^ve $sırasıyla 2 bayt için, desen başına ve sonuna eklenmesi gerekir.

([^K]|K($|[^O]|O($|[^R]|R($|[^O]|O($|[^N]|N($|[^K]|K($|[^O]|O($|[^R]|R($|[^K]|K($|[^O]))))))))))*

Regex101 bağlantısı

Önceki yanlış çözüm (yorumlara bakın):

K|([^K]|K([^O]|O([^R]|R([^O]|O([^N]|N([^K]|K([^O]|O([^R]|R([^K]|K[^O])))))))))*

Düzenleme: Tek K eklendi


2
Bu eşleşmelere inanmıyorum K.
orlp

@orip - İyi yakaladın. Sabit.
RootTwo

En son güncelleme şimdi başarısızKKORONKORKO
Sp3000

Düzeltilebilir mi? Herhangi bir fikir?
RootTwo

1
Başlangıç ^ve bitiş $gerekli değildir. Ayrıca, =ve $izin verilmiyor.
LegionMammal978
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.