Koli bandı bir Regex Decider


11

Göreviniz, belirli bir dizenin geçerli bir normal ifade olup olmadığını belirleyen ve StackExchange ağındaki sitelerden kaynaklı kod parçacıklarını kullanıp kullanmadığını belirleyen bir program oluşturmaktır.

Bu meydan okuma amaçları doğrultusunda, düzenli ifade diyalekt meta karakterlerin bir aşağı sıyrılmış ve çoğunlukla asgari seti olacaktır: ()*?|\. Bu nedenle, yerleşik regex ayrıştırıcılarını kullanamayacaksınız.

  • \meta karakterlerden kaçmak için kullanılır. Bunu bir meta karakter izlemelidir.
  • Kaçan parantezler dengelenmelidir
  • *ve ?öncesinde meta olmayan karakter, parantez içindeki grup veya çıkış karakterli meta karakter kullanılmalıdır.
  • Diğer tüm yazdırılabilir ASCII karakterleri ve yeni satır, sekme ve boşluk meta olmayan karakterler olarak desteklenmelidir. Diğer karakterleri içeren bir dizgide ne olduğu belirsizdir.
  • Normal ifadenin gerçek anlamı bu zorluk için önemli değildir.

Örnekler

Truthy:
  abc
  a?
  (a|)*
  ()
  a|b*
  \*
  \\
  \\*
  a*b?(cd|e)
  +
  [
  }
  (123\))*
  \|
  (a(b(c|d)*e)*f)*
  (|\)*)
  (abc)+*
  (abc)+
  +abc

^ last test case is an actual newline

Falsy:
  ?abc
  *
  **
  \
  (
  a*?
  a?*
  ?
  a)
  (\)
  (|\)*
  \()
  |*
  (?:abc)
  \\**
  \n

puanlama

Genel puanınız StackExchange çevresindeki soru ve cevaplardan alınan snippet sayısıdır.

  • Tekrarlanan snippet'ler kullanıldıkları kadar sayılır.
  • Boşluk serbestçe eklenebilir ve kaldırılabilir (Python, Haskell ve boşluklara duyarlı diğer diller nedeniyle) ve snippet sayınıza dahil değildir.
  • Bu meydan okumadan daha eski sorular, yanıtlar ve yorumlardan geldiği sürece snippet'lere herhangi bir StackExchange sitesinden izin verilir (düzenleme süresi dahil - gerekirse eski düzeltmeleri kullanın). (24 Eyl 2019 @ 15:30 UTC)
  • Parçacıklar, önceden biçimlendirilmiş bir kod bloğunda olsun ya da olmasın, soru, yanıt veya yorum gövdesinin herhangi bir yerinden gelebilir.
  • Bir parçacığı diğerinin ortasına eklemek dış parçacığın iki parçacık olarak sayılmasına neden olur

En düşük puan kazanır!


1
@RobinRyder evet, değişti
Beefster

Gönderi bu zorluktan daha büyük veya ona eşit olabilir mi, yani bu zorluğun gövdesinden parçacıklar kullanabilir miyiz?
Jo King

1
"Bu şekilde, yerleşik regex ayrıştırıcılarını kullanamayacaksınız" Bu basit bir ya / nay için bunu önlemek için tasarlanmış mı yoksa cevaplarımızda hiç regex kullanmamızın yasak olduğu anlamına mı geliyor?
user0721090601

@guifa dilinizin regex motorunu alıp verilen regex'i derleyip derlemediğini göremeyeceğiniz şekilde tasarlanmıştır. Bildiğim her dil, daha büyük bir meta karakter kümesini ve özel yakalama gruplarını destekler, bu nedenle her durumda bu karakter kümesiyle doğru şekilde eşleşmezler.
Beefster

1
@ JL2210 Bu iki parçacığı yapar: biri başlangıç ​​için, diğeri son için. Tüm test
senaryolarını geçtiği ve

Yanıtlar:


6

Perl 6 , 20 parçacıklar

{$_ eq m/[[<-[()*?|\\]>|\\<[()*?|\\]>|'(' <~~>* ')']<[*?]>?|\|]+/}

Çevrimiçi deneyin!

Parçacıklar şuradan alınır:

{$_ eq, m/[, <-[, ()*?, |\\, ]>, |\\, <[, ()*?, |\\, ]>, |, '(' <~~>* ')', <[, *?, ]>, ?|, \|, ]+/, }.

Bu çoğunlukla açgözlü bir yaklaşımdır (bir veya iki karakter parçacığı tarafından açıkça belirtilir). Tek tek karakterleri aramak için SymbolHound'u kullandım ve tek gerçek optimizasyon, özyinelemeli Perl 6 regexes hakkındaki kendi cevabımdan'(' <~~>* ')' alınan snippet idi .

Açıklama:

Bu temel olarak girdinin geçerli bir normal ifadeyle açgözlü bir eşleşmeye eşit olup olmadığını kontrol eder. Regex'in kendisini kullanamamamızın ve ^$uçları işaretlemek için eklemememizin nedeni, ^$belirteçler olsaydı işe yaramayacak özyinelemeli bir regex kullanmamızdır . Normal ifadenin kendisi:

m/[                             ]+/   # Match one or more times
   [              ]  # Any of 
    <-[()*?|\\]> |     # Not a metacharacter
    \\<[()*?|\\]>      # A metacharacter preceded by a \
    '(' <~~>* ')'      # Brackets surrounding a valid regex
                   <[*?]>?  # Optionally followed by a ? or *
                           | \|    # Or just the | metacharacter

TIL ~~, teşekkürler!
user0721090601

@guifa Evet, P6 şartnamesiyle öğrendim , ki bu henüz düzgün bir şekilde belgelenmemiş birçok şey içeriyor. Şüphesiz ~~görünmüyor çünkü henüz tam olarak uygulanmadı (örneğin <~~0>), orada başka gizli taşlar da var.
Jo King
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.