ダクトテープ正規表現の決定者


11

あなたの仕事は、StackExchangeネットワーク上のサイトから供給されたコードスニペットを使用して、特定の文字列が有効な正規表現であるかどうかを決定するプログラムを作成することです。

この課題のために、正規表現の方言は取り除かれ、ほとんどの場合メタ文字の最小限のセットになります()*?|\。そのため、組み込みの正規表現パーサーを使用することはできません。

  • \メタ文字をエスケープするために使用されます。その後にメタ文字が必要です。
  • エスケープされていない括弧はバランスをとる必要があります
  • *また、?前に非メタ文字、括弧で囲まれたグループ、またはエスケープされたメタ文字のいずれかが必要です。
  • 他のすべての印刷可能なASCII文字と、改行、タブ、スペースは、非メタ文字としてサポートされている必要があります。他の文字を含む文字列で何が起こるかは未定義です。
  • 正規表現の実際の意味は、この課題にとって重要ではありません。

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

得点

総合スコアは、StackExchangeに関する質問と回答から取得したスニペットの数です。

  • 繰り返しスニペットは、使用された回数だけカウントされます。
  • 空白は自由に追加および削除でき(Python、Haskell、およびその他の空白に敏感な言語のため)、スニペット数にはカウントされません。
    • 例外は、コードが実際にWhitespaceで記述されている場合です。
  • この課題よりも古い質問、回答、コメント(編集時間を含む-必要に応じて古いリビジョンを使用)からのものである限り、任意のStackExchangeサイトからスニペットを使用できます。(2019年9月24日午後3時30分UTC)
  • スニペットは、事前にフォーマットされたコードブロック内にあるかどうかに関係なく、質問、回答、またはコメント本文のどこからでも取得できます。
  • スニペットを別のスニペットの中央に接合すると、外側のスニペットが2つのスニペットとしてカウントされます

最低スコアが勝ちます!


1
@RobinRyderはい、変更されました
Beefster

投稿はこのチャレンジと同じかそれよりも古いものにすることができますか?つまり、このチャレンジの本文からのスニペットを使用できますか?
ジョーキング

1
「そのため、組み込みの正規表現パーサーを使用することはできません」それは、単純なya / nayに対してそれを使用することを阻止するように設計されている、または私たちの回答で正規表現を使用することは一切禁止されていると言いますか?
user0721090601

@guifaこれは、言語の正規表現エンジンを使用して、指定された正規表現をコンパイルするかどうかを確認できないように設計されています。私が知っているすべての言語は、メタ文字と特殊なキャプチャグループのより大きなセットをサポートしているため、すべてのケースでこれらの文字のセットと正しく一致しません。
Beefster

1
@ JL2210これで2つのスニペットになります。1つは開始用、もう1つは終了用です。すべてのテストケースに合格し、このチャレンジよりも古い回答/質問/投稿からのものである限り、単一のスニペットを使用できます
Beefster

回答:


6

Perl 6、20スニペット

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

オンラインでお試しください!

スニペットは以下から取得されます:

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

これは主に貪欲なアプローチです(1つまたは2つの文字スニペットすべてで明らかになります)。SymbolHoundを使用して個々の文字を検索しましたが、唯一の真の最適化は'(' <~~>* ')'スニペットでした。これは、再帰的なPerl 6正規表現に関する自分の回答から引用したものです。

説明:

これは基本的に、入力が有効な正規表現の貪欲な一致に等しいかどうかをチェックします。正規表現自体を使用し^$て末尾をマークするために追加できないのは、再帰的な正規表現を使用しているため^$です。これは、マーカーがあると機能しません。正規表現自体は次のとおりです。

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 ~~、ありがとう!
user0721090601

@guifaはい、私はP6仕様を通してそれを学びました、それはまだ適切に文書化されていない多くのことを持っています。~~まだ完全に実装されていないため(たとえば<~~0>)、表示されないのではないかと思いますが、他にも隠された宝石があります。
ジョーキング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.