目標
今日のコードゴルフの課題は、できるだけ少ない文字で正規表現パーサーを作成することです。
構文
いいえ、Perlスタイルの正規表現に一致するように求めているわけではありません。結局のところ、それらのための非常に信頼できるインタプリタがすでにあります!:-)
このチャレンジの正規表現構文について知っておく必要があるのは次のとおりです。
- 用語は、単一のリテラル文字、またはグループ化括弧内の正規表現として定義されます
()
。 - (
*
アスタリスク)文字は、前のTERMでのクリーネ閉包操作を表します。これは、前の用語が0個以上連結されていることを意味します。 - (
+
プラス)文字は便利なショートカットを表します。は、前の用語の1つ以上を意味するa+
と同等です。aa*
- (
?
疑問符)文字は、前の用語の0または1つを表します。 - (パイプ)文字は交互を表します。
|
つまり、どちらの側の正規表現も試合で使用できます。 - 他のすべての文字はリテラルであると見なされます。他のすべての文字が中にあると想定することができます
[0-9A-Za-z]
(つまり、すべての英語の英数字)。
または、別の言い方をすれば、 *
//優先順位が最も高く、次に連結、次に交互になります。交互は連結よりも優先順位が低いため、括弧なしで正規表現内で使用すると、両側で完全な正規表現にバインドされます。一方、およびは、直前の用語にのみ適用されます。+
?
*
+
?
チャレンジ
あなたの課題は、正規表現(上記で定義されている)をコンパイルまたは解釈し、それに対していくつかの文字列をテストするプログラムを作成することです。
入力はあなたに任せます。私の推奨事項は、おそらく正規表現が最初に来て、次にそれに対してテストされる任意の数の文字列が来ることです。しかし、それを長持ちさせたいのであれば、それは問題ありません。すべてをコマンドライン引数またはstdinに入れたい場合、またはコマンドラインに正規表現を入れてstdinに文字列を入れたい場合など、それで問題ありません。使用例を1つか2つ示してください。
正規表現が一致するかどうかを反映するために、出力はtrue
またはfalse
、1行に1つである必要があります。
ノート:
- 私はこれを言う必要はありません...しかし、あなたの言語で正規表現ライブラリを使用しないでください!パターンを自分でコンパイルまたは解釈する必要があります。(編集:文字列の分割または結合に必要な場合は、正規表現を使用できます。たとえば、入力正規表現を言語正規表現に変換して使用するなど、問題を直接解決するために使用することはできません。)
- 正規表現は、このチャレンジの入力文字列と完全に一致する必要があります。(同様に、Perlのような正規表現に精通している場合は、すべての一致に対して文字列の開始と終了のアンカーが設定されていると想定します)
- このチャレンジでは、すべての特殊文字
()*+?|
が文字通り出現することは期待されていません。入力に出てきた場合、問題の文字列に一致するパターンはないと想定しても安全です。 - テストする入力文字列は、大文字と小文字を区別して評価する必要があります。
例
例では、すべてがコマンドライン引数で行われると想定しています。最初に正規表現を使用します。(上で述べたように、入力はあなた次第です。)myregex
ここで、プログラムの呼び出しを表します。
> myregex easy easy Easy hard
true
false
false
> myregex ab*a aa abba abab b
true
true
false
false
> myregex 0*1|10 1 10 0110 00001
true
true
false
true
> myregex 0*(1|1+0) 1 10 0110 00001
true
true
true
true
> myregex a?b+|(a+b|b+a?)+ abb babab aaa aabba a b
true
true
false
true
false
true
注:申し訳ありませんが、コミュニティwikiを作成するのを忘れました!:-(