Preg問題タイプ

提供:MoodleDocs
2021年4月7日 (水) 01:10時点におけるToshihiro KITA (トーク | 投稿記録)による版
移動先:案内検索


注意: このプラグインは、現在 (2020年2月) Moodleブランチ2.3から3.1のみで利用可能と記載されていますが、プラグイン統計タブでは、このプラグインがインストールされている30以上のサイトのうち、半分が3.2から3.8のMoodleブランチであることがわかります。公式にサポートされていないブランチでも、正規表現プラグインは動作しますが、'オーサリングツール' は利用できません。プラグイン開発者は、このプラグインをアップデートして、この問題を引き起こすJavaScriptの問題を修正するために作業しています。DEVELOPER レベルのデバッグを有効にした場合、サーバに危険を及ぼさない警告が表示されることがあります。これらは将来のリリースで修正されるはずです。

Pregは、正規表現 (regexes)を使用して、学生の回答をチェックする問題タイプです(ただし、ヒント機能のために、正規表現なしで使用することもできます)。正規表現は、問題を作成するときの教師と答えを書くときの学生の両方に、膨大な機能と柔軟性を与えます。最初のセクションでは、このドキュメントの使い方を説明していますが、慎重に使用してください。正規表現の構文についての詳細は http://www.nusphere.com/kb/phpmanual/reference.pcre.pattern.syntax.htm にあります。多くの優れた正規表現のマニュアルがありますが、ここでは繰り返しません。

Preg問題とこのドキュメントの利用方法

正規表現については何も知らない (知りたくない) けど、次の単語 (文字) をヒントにするのは便利そうだな

Preg問題タイプを記述と同じように使うことができますが、正規表現についての知識がなくても、高度なヒントを得ることができます。そのためには、選択する必要があります。

  • Notation => Moodle shortanswer
  • Engine => Finite state automata
  • Exact matching => Yes

その後は、あなたの記述問題から答えをコピーすればいいのです。ヒンティングの設定については、ヒンティングのセクションを読んで理解しておくとよいでしょう。いくつかの図解された、ステップバイステップの、K-12および大学レベルの使用例については、Preg問題タイプの例を参照してください。

正規表現の知識は漠然としているが、パターンマッチングを利用してみたい

正規表現を書くのは大変だけど、その強みをパターンとして利用したい場合、オーサリングツールが問題の作成に大いに役立つでしょう。ツールは正規表現の意味を様々な方法で示してくれます: 表現の内部構造(シンタックスツリー)、マッチングの視覚的なパス(説明グラフ)、そしてテキストの説明です。また、複数の文字列に対して正規表現をテストし、期待通りに動作するかどうかを確認することもできます。あなたの正規表現を実験し、遊び、オーサリングツールの対応する変更を見て、最終的にはあなたが望む正規表現を手に入れてください。

まずオーサリングツールのセクションを読み、その後(おそらく自分でツールを試した後)正規表現を理解するのセクションを読みます。(これは任意ですが、面白いし、大いに役立つでしょう) また、問題の仕組みのセクションも読んで、様々な設定とそれが問題にどのように影響するかを理解しておくと良いでしょう。

正規表現をしっかり学んで、正規表現が許すことなら何でもできるようになるための努力をしたい

さて、あなたは正規表現を知らないけれど、それを理解して複雑な表現を簡単に作りたいと思っています。闇雲に努力するのではなく、このセクションを読んで理解することに時間と労力を費やした方が良いでしょう。そして、オーサリングツールについて少し読み、それらを使って正規表現の作成を試してみましょう。これらのツールを使えば、本当によく理解できているか、期待通りの動作をするかを確認することができます。構文ツリーは、優先順位アリティ の意味を正しく理解しようとするときに特に役立つでしょう。正規表現の原理をよく理解したら、問題の仕組み正規表現のリファレンスのセクションを読んでください (可能性を知るためです。わざわざすべてを理解したり覚えたりする必要はありません。定期的に新しいことを学ぶためにそこを見ればいいのです)。これで、オーサリングツールをあまり使わずに正規表現を書けるようになったはずですが、式をテストするためのテストツールは別です。

私は正規表現をよく知っているので、詳しい説明がなくても自分で書けます

様々な設定とその下での問題の動作を理解するために、問題の仕組みを読むべきです。また、オーサリングツールのセクションの正規表現テストにも興味があるかもしれません。最後に、正規表現リファレンスも参考になるかもしれません。

==対応するMoodleブランチと翻訳==。 このプラグインは、現在 (2018年4月) Moodleブランチ2.3から3.1のみで利用可能と記載されていますが、stats page によると、このプラグインがインストールされている50以上のサイトのうち、半分は3.2から3.4のMoodleブランチです。公式にサポートされていないブランチでは、正規表現プラグインは動作しますが、オーサリングツールは利用できません。プラグイン開発者は、このプラグインをアップデートし、この問題の原因となっているJavaScriptの問題を修正するために作業を行っています。DEVELOPERレベルのデバッグを有効にした場合、サーバに危険を及ぼさない警告が表示されることがあります。これらは将来のリリースで修正される予定です。

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP

すべてのMoodleプラグインと同様に、pregプラグインは、最初は英語で利用できます。現在、ロシア語およびメキシコのスペイン語の翻訳が利用可能ですが、AMOSで他の翻訳を行うことができます。

インストール方法

  • Moodle plugins databaseからダウンロード/インストールしてください。
  • すべてのプラグインの依存関係をインストールしてください。

preg missing dependencies.png

preg pathtodot.png

  • Windowsの場合、path to dotへのパスはC:\Program Files (x86)\Graphviz2.38\bin\dot.exeとなります。
  • Macでpath to docを見つけるには、ターミナルウィンドウを開き、次のように入力します。
which dot
    • そして、そのパス(例: /opt/local/bin/dot)を 'サイト管理 / ▶︎ サーバ / ▶︎システムパス' のPath to dotに入力します。

PREG問題の仕組み

基本的に、この問題タイプは記述問題タイプの拡張バージョンです。いくつかの異なる方法でその機能を拡張しています(ほとんどどのような組み合わせでも使用できます)。

  • パターン・マッチング - 正規表現を使用して、可能性のある学生の答えを記述する強力なパターンを作成できます。
  • ヒンティング - 学生が問題に行き詰まったとき、次の正しい単語(lexeme)や文字(ペナルティの可能性あり)を尋ねることを許可することができます。

問題の作業に影響する設定

答えとして指定したすべての正規表現の大文字・小文字の区別を設定します。なお、正規表現部分の大文字・小文字の区別を設定することもできます。 完全一致 は以下のように問題に影響します。

Yes
最初の文字から最後の文字まで、学生全体 の解答があなたの正規表現と一致する必要があります。
No
学生の解答には、あなたの正規表現に一致する 部分 を含めることができます。例えば、正解が "全体" の場合、"the whole enchilada"、"the whole shebag"、"the whole nine yards"、"the whole world"、"the whole truth" はすべて正しい学生の解答となります。

また、special regex syntaxを使用して、いくつかの正規表現を学生の解答全体にマッチするように設定することもできます。

Notations は、解の "言語" を指定するものです。

Regular Expression
正規表現のための通常の記法です。正確には、Perl互換の正規表現の方言です。読みやすくするために、複数の文字列で正規表現を書いても構いません。
正規表現(拡張)
本当に複雑な正規表現に便利です。これは、PHP の 'x' 修飾子に似ています。正規表現の中で、文字クラスの中にないエスケープされていない空白を無視します。- これにより、スペースを使って自由に正規表現をフォーマットすることができます。また、改行も無視しますが、便利な例外があります。'#' 文字以降、文字列の最後まではコメントとして扱われます(#はエスケープしてはいけませんし、文字クラスの中にあってはいけません)。
Moodle shortanswer
これを使えば、正規表現の構文を一切使わずに、記述問題の解答をそのままコピーすることができます。ワイルドカードの '*' に対応しています。FAエンジンを選択すると、ヒント機能を利用することができます。正規表現についての説明は省略できますが、問題のヒント動作を設定するために変更できる様々な設定を理解するために、ヒントセクションを必ず読んでください。有用なヒントと動作例については、Preg問題タイプの例を参照してください。

マッチングエンジンは、正規表現によるマッチングを行うプログラムモジュールを指定します。最適なマッチングエンジンというものはなく、使用する機能によって異なります。エンジンにはさまざまな安定性があり、使用できる機能も異なります。

PHP preg extension
は、ヒントが必要ない他のエンジンがあなたの表現を難しすぎると拒否する、またはバグに遭遇した場合に使用するべきです。これは、PHPのネイティブなpreg_関数をベースにしています。100% perl 互換の正規表現機能をサポートしており、非常に安定しており、徹底的にテストされています。しかし、部分一致をサポートしていないので、 (PHP開発者に部分一致のサポートを追加させない限り) no hinting はありません。しかし、サブパターンの取り込みには対応しています。他のエンジンがサポートしていない複雑な正規表現機能が必要な場合は、このエンジンを選択してください。
Finite state automata (FA)
学生のための ヒントの実行 に使うことができます。FA エンジンはカスタムPHPコードで、多くの (すべてではない) 正規表現機能をサポートし、徹底的にテストされています (AT&T testregex スイートのすべてのテストと、サポートしている機能に関する PCRE testinput1, testinput4 スイートのほとんどのテストに合格しており、これは非常に意味のあることです)。今のところサポートされていない機能は、ルックアラウンドアサーションといくつかのタイプの条件付きサブパターンです。

誤字脱字検出

3.2以降のFAエンジンでは、誤字脱字の検出がサポートされています。

先生方は、誤字脱字のある解答が完全に間違っていると評価されることを望まないことが多いです。このシステムは4種類のタイポを検出して修正します。

 character insertion: cot → coat
 character deletion: cooat → coat
 character substitution: coot → coat
 characters transposition: caot → coat

問題設定で誤字脱字検出を有効にして、誤字脱字制限(解答に許容される誤字脱字の数)と誤字脱字のペナルティ(ゼロにすることも可能)を指定する必要があります。 typo detection.png

ヒント

ヒントは、adaptive and interactive behavioursのFAエンジンでサポートされています。

部分一致

ヒントは 部分一致 から始まります。部分的に正しい解答とは、正しい文字で始まり(正規表現にマッチする)、ある文字でマッチが切れる文字列を意味します。例えば、"フランスとオランダの国旗に使われている色は何ですか?" という質問をして、正規表現を入力したとします。

 "are blue, white(,| and) red"

と学生が答えました。

 "they are blue, vhite and red"

このような場合、部分的に一致するのは

 "are blue, "

正規表現は固定されていないため ("完全一致" が "いいえ" に設定されている)、学生の解答の最初の文字でマッチしないことがあることに注意してください (上記の例のように "they" がスキップされます)。部分一致を使用している間、学生は正しい部分と間違った部分を見ることになります。

 they are blue, vhite and red

preg the colors of the french flag.png

一般的なヒントのルール

REGEXP Regular Expression Short-Answer question typeとは異なり、Preg問題タイプはヒント文字を学生の解答に追加せず、いくつかの理由から別々に表示します。

  1. 自分の解答にヒント文字を追加したいかどうかは学生の責任です (さらにいくつかの理由もあります)。
  2. 解答が修正されると、ヒント を繰り返し押すのが簡単になってしまうので、ヒントを考えるのがわずかに楽になりますが、これは通常望ましい行動ではありません。

ヒントは可能な限り、マッチを完了するための最短経路につながる文字を選択します。先ほどの正規表現に対する解答を考えてみましょう。

 are blue, white; red

ヒントとなる文字は2つあります。"," または " "( " および " のパスにつながる)です。問題では "," はマッチを完成させる最短のパスを導くので選択され、 " " は3文字長いパスを導くので選択されます。

すべての正規表現が100%の評価を得られるとは限りません。記憶力の悪い学生のための表現を追加したとします。

 are white(,| and) red

60%の評価と を忘れたことについてのフィードバック。あなたは、ヒントを使って学生を回答に導くことを望まないかもしれません。

  are white, red

もし彼が

  are white, oh I forgot the other colors.

Hint grade border はこれを制御します。評定がHint grade border以上の正規表現のみが部分一致とヒントに使用されます。Hint grade borderを1に設定すると、評定100%の正規表現のみがヒントに使用され、0,5に設定すると、評定50%~100%の正規表現がヒントに使用され、0%~49%の正規表現は使用されません。ヒントに使用されない正規表現は学生の解答と完全にマッチした場合のみ機能します。

次の文字のヒント

次の文字のヒントが利用可能な場合、学生は hint next character ボタンを押して、背景色でハイライトされた1つの次の正しい文字を受け取ることができます。

 they are blue, wvhite and red

通常、ヒント ペナルティ は通常の問題 ペナルティ よりも多く設定する必要があります。なぜなら、これらのペナルティは別々に適用されるからです。

次のレキシム (語彙) ヒント

語彙 とは、言語の原子部分を意味する。自然言語では、単語数字句読点 (または '?!' や '...' のようなマークの集まり)が語彙となる。プログラミング言語の場合は、キーワード変数名定数operator などになります。なお、スペースは特定の意味を持たないため、通常は字句ではなく字句間のセパレータと考えられています。

次の語彙ヒント は、現在の語彙を完成させるか(部分一致がその中で終わった場合)、次の語彙を表示します(学生が現在の語彙を完成させた場合)。例えば

  are blue

または

  are blue,

または

  are blue, white

Preg問題タイプでは、2.3リリース以降、formal languages block を使用して、次の字句のヒントを使用することができます。言語によって語彙の境界が異なるため、問題に対する解答を期待する言語を選択する必要があります。今のところ、以下の言語をサポートしています(今後も増える予定です)。

simple English
英語のスキャナは、単語、数字、句読点を認識します。
C/C++ language
プログラミング言語のC (またはC++) です。
printf language
プログラミング言語C (またはC++) で文字列をフォーマットするための特殊な言語ですが、おそらく無効になっているでしょう。

サイト管理者は、混乱を避けるために、教師が利用できる言語をコントロールすることができます。プラグインの設定メニューにあるブロック "Formal languages" の設定をご覧ください。

注意: simple Englishの言語オプションは、他の人間が書く言語にも使用できますが、学生が小テストを受ける前に、正規表現が期待通りに機能するかどうかをチェックするのが賢明でしょう。現在(2018年3月)。メキシコのスペイン語(小数点を使用)とロシア語(小数点のコンマを使用)でテストしました。

なお、"lexeme "は通常、ヒントボタンで学生に表示させたい単語ではありません。それぞれの言語で、独自の言葉が定義されています。デフォルトの単語が気に入らない場合は、問題の説明に別の単語を入力することができます。

画像ヒントの修正方法

誤字脱字検出が有効で、学生の解答が完全であるが誤字脱字が含まれている場合、学生はどのボタンを押しても hint next character ボタンが表示されます。 彼は、見つかったすべてのタイプミスを修正するために文字列にどのような変更を加える必要があるかを示す画像を受け取ります。 how to fix url.png

サブパターンのキャプチャとフィードバック

正規表現の中の任意の括弧のペアは サブパターン とみなされ、マッチングの際にエンジンはマッチ全体だけでなく、すべてのサブパターンに対応する部分も記憶(キャプチャ)します。サブパターンは入れ子にすることができます。サブパターンが繰り返されている場合(すなわち、量詞を持っている場合)、すべての繰り返しの中で最後にマッチしたものだけがキャプチャされます。キャプチャするサブパターンを定義せずに評価の順序を変更したい場合(処理が速くなる)は、単に ( ) ではなく (?: ) を使用してください。ルックアラウンドアサーションはサブパターンを作成しません。

サブパターンは括弧を開けて左から右へと数えられます。正確には、0 は正規表現全体、1 は最初のサブパターンなどです。答えのフィードバック には、簡単なプレースホルダを使ってそれらを挿入することができます。{$0} はマッチ全体に、{$1} は最初のサブパターンの値などに置き換えられます。これにより、フィードバックの質が向上します。プレースホルダは 一般的なフィードバック では機能しません。なぜなら、異なる回答は異なる数のサブパターンを持ちうるからです。

注意: 以下の文章は、サイトの言語で小数点記号としてポイント文字が使われていることを想定しています。

ここでは、任意の整数部を持つ10進数を定義する正規表現を見てみましょう。

 [+\-]?([0-9]+)?\.([0-9]+)

これには2つのサブパターンがあります。1つ目は積分部分、2つ目は数字の小数部分です。 フィードバックを書いた場合:

The number is: {$0} Integral part is {$1} and fractional part is {$2}

それから学生が入った

123.34

彼が見るのは

The number is: 123.34 Integral part is 123 and fractional part is 34

積分部分が与えられていない場合、{$1} は空の文字列に置き換えられます。このような状況で "整数部" を消去する方法は(今のところ)ありません。プレースホルダの構文が複雑になり、エラーが発生しやすくなる可能性があります。

なくなったもの、置き忘れたものを探す

Joseph Rezeauによって作成されたRegular Expression Short-Answer question type(REGEXP)には missing words 機能があり、答えの中に何かが欠落している場合に機能する答えを定義することができます(そして学生に適切なフィードバックを与えることができます)。

同様の効果は、否定的な主張とマッチング開始のアンカーを組み合わせることでも得られます。欠けている単語 necessary を探すための正規表現は

 ^(?!.*bnecessary\b.*)

となります。

  • (?!.*\bnecessary\b.*)負の先読み のアサーションで、文字列のどこかの時点で necessary という単語がない場合にのみマッチングを許可します。
  • ^ もアサーションで、マッチを解答の先頭に固定します(そうしないと、レスポンスの中で "necessary" という単語の後に、その単語があってもマッチが可能な場所ができてしまいます)。

説明が難しい場合は、見つからない正規表現を ^(?!)) で囲んでください。'--' 構文は試さないでください。これはJoseph Rezeauによって作成されたRegular Expression Short-Answer question type(REGEXP)に特有のものです!

また、次のような構文を使って、誤植された単語 を大まかに検索することもできます(実際には、他のものが正しい場合にのみ機能します)。

  (?!<I\s+)\bam\b(?!\s+victor)

この表現は、"I am victor" という文章の中で、"am" の前に "I" がなく("(?!<I\s+) "の部分)、その後ろに "victor" がある("(?!<I\s+victor) "の部分)ことで、"am" の置き忘れを検出します。"\s+" は、単語の間にいくつでもスペースを入れることができます。最初 (最後) の単語 (句読点など) を検出したい場合は、関連するアサーションの中に単語ではなく、文字列の開始/終了を示す単純なアサーション ("^" または "$") を配置する必要があります。例えば、"I" の間違いを探すには、次のように書きます。

  (?!<^)\bI\b(?!\s+am)

これは、"I" が文字列の先頭になく、"am" が続いていないものを探します。

注意していただきたいのは、紛失したものや置き忘れたものを補足するためにいくつかの答えを用意しても、実際には学生のどのような解答に対しても1つしか機能しないということです。

Preg 2.3 リリース以降、ヒントと欠落している単語を探すことを組み合わせることができます。しかし、欠落しているものを探す (そして具体的なフィードバックを与える) 答えは、'hint grade border と呼ばれる 分数 (評点) が低いことを確認する必要があります (#ヒント参照)。これらの答えは正しい状況を定義していないので、実際にはヒントを生成したくないでしょう。これは問題ではなく機能です。

テンプレート

Preg 2.8では、テンプレートという新機能が導入されました。

テンプレートは、頻繁に使用するパターンを記述するための、より便利で意味のある方法です。テンプレートは、実行前に特別な正規表現に変更される正規表現のコメントです。いくつかのテンプレートはパラメータ化することができ、任意の正規表現をパラメータ値として使用することができます。

  • Simple template => (?###template_name)
  • Parametrized template => (?###template_name<)param1(?###,)param2(?###,)...paramN(?###>)

テンプレートは、正規表現をより短く、理解しやすくするために使用することができます。特に複雑な正規表現(通常は括弧を含むもの)については、extended notationを使用して、改行やスペースを使用して正規表現をより適切にフォーマットできるようにすることを検討してください。

今のところ、テンプレートはPreg問題タイプにハードコードされていますが、次のリリースでは、ユーザのカスタムテンプレートのサポートを追加する予定です。

現時点では、以下のテンプレートが利用可能です。

Template name Parameters Description Example
word None One or more 'word' characters (letters, digits and underscore). ((?###word)\s+)+ will match any number of words with any number of spaces between them
integer None Optional sign + or -, followed by one or more digits (?##integer) will match any integer value
parens_req The text you want to see in parentheses Something in at least one pair of correctly closed round parentheses (?###parens_req<)a(?###>) will match (a) ((a)) and (((((a)))))
parens_opt The text you want to see in parentheses Something optionally placed in any number of pairs of correctly closed round parentheses (?###parens_opt<)a(?###>) will match a (a) and (((a)))
brackets_req The text you want to see in brackets Something in at least one pair of correctly closed square brackets (?###brackets_req<)(?###word)(?###>) will match [abc] [[cat]]
brackets_opt The text you want to see in brackets Something optionally placed in any number of pairs of correctly closed square brackets (?###brackets_opt<)(?###word)(?###>) will match cat [dog] [[[Fido]]]
custom_parens_req 1. Pattern for the opening parenthesis 2. Text inside custom parentheses 3. Pattern for the closing parenthesis This template is similar to the parens_req, but allows you to specify custom parentheses (possibly by more than one character) (?###custom_parens_req<)<(?###,)a(?###,)>(?###>) will match <a> <<<a>>>
custom_parens_opt 1. Pattern for the opening parenthesis 2. Text inside custom parentheses 3. Pattern for the closing parenthesis This template is similar to the parens_req, but allows you to specify custom parentheses (possibly by more than one character) (?###custom_parens_opt<)/\*(?###,)(?###word)(?###,)\*/(?###>) will match /*something*/ /*/*/*word*/*/*/

あるテンプレートは、他のテンプレートの中でパラメータとして使用することができます。例えば、以下のように書くことができます。

 (?###parens_opt<)(?###word)(?###>)

文字列 "a"、"(a)"、"(((((long_word_in_many_parens)))))" などにマッチします。

オーサリングツール

オーサリングツールは、正規表現を書いたり、テストしたり、理解したりするのに役立ちます。ツールは、書かれた正規表現(およびその部分)の意味を示し、それをテストすることができます。

オーサリングツールは、正規表現フィールドの近くにある "編集" アイコン(歯車)を押すと起動します。

regex authoring tools editor.png

注意: オーサリングツールを開くために歯車をクリックすると、ポップアップウィンドウのタイトルが 'Regex constructor' になっています。

Regexコンストラクタでオーサリングツールを完全に使用したい場合、オープンソースのGraphvizグラフビジュアライゼーションソフトウェアをインストールして、Moodleサーバの 'サイト管理 ► サーバ ► システムパス ► Path to dot' に 'path to dot' (WindowsではC:\Program Files (x86)\Graphviz2.38\bin\dot.exe) を設定する必要があります。

preg pathtodot.png

Syntax Tree や Explaining Graph ツールを描画するためには、グラフ可視化ソフトウェア Graphviz が必要です。

authoring tools icon

Regexコンストラクタには4つのツールが用意されています。

シンタックスツリー
正規表現の内部構造を表示します。
説明用のグラフ
表現がどのように機能するかを図解しています。
説明
表現の意味を英語で表現します。
テストツール
文字列を入力して、それが正規表現にどのようにマッチするかを見ることができます。

インストール時の注意点と既知の技術的問題

シンタックスツリー および 説明用グラフ オーサリングツールを動作させるには、Graphvizグラフ可視化ソフトウェアをサーバにインストールし、Moodleインストール時に 'サイト管理 ► サーバ ► システムパス ► Path to dot' で 'pathtodot' 設定を行う必要があります。 Windowsの場合、'Path to dot' は、C:\Program Files (x86)\Graphviz2.38\bin\dot.exeになります。

Graphvizは、あなたのために絵を描くために使用されます。それ以前のバージョンでは、svgの出力にバグがあり、正しくない絵になってしまうので、必ずGraphviz 2.36以降を使用してください。

シンタックスツリーや説明用のグラフは、古いOperaのバージョンでは正しく動作しないことがあります - 何らかの理由で、ユーザの操作で画像が更新されないのです。幸いなことに、Windows用の新しいバージョン16があり、オーサリングツールでうまく動作します。Linuxでは別のものを使用する必要があります。

正規表現エリア

ここでは、正規表現を編集することができます。"表示" をクリックすると、すべてのツールに正規表現が送信され、シンタックスツリー、説明用グラフ、説明文、テスト結果が更新されます。"保存" をクリックすると、オーサリングツールのフォームが閉じられ、メインの問題編集フォームに正規表現とテスト文字列が保存されます。"キャンセル" は、オーサリングツールフォームを閉じ、そこで行われたすべての変更を破棄します。

ここで正規表現の一部を選択すると、構文ツリー、説明グラフ、説明、文字列のマッチした部分の対応する部分がハイライトされます。正規表現の論理的に完成された部分に対応していない正規表現テキストの一部を選択することができます。その場合、選択範囲は、最も近い論理的に完成された部分に拡大されます。

マッチングオプション

ここでは、マッチングに影響を与えるオプション(マッチングエンジン、正規表現、完全一致、大文字小文字の区別)を変更できます。

  • マッチングエンジン は、マッチングを行うコードを変更するもので、自分のニーズに合っているかどうか、テストツールを使って確認することができます。
  • 正規表現記法 は正規表現の書き方を変えます - すべての器具は、この記法がどのように解釈されるかの違いを示します。
  • 大文字小文字を区別しないノードはグレー、大文字小文字を区別するノードは白になります。
  • 完全一致 では、学生の解答全体が一致するように、正規表現に新しい部分を追加します。これらの追加された部分はツールの中でグレーの背景で表示されます - 以下の図を参照してください。

exact matching

写真のパンおよびズーム

シンタックスツリーや説明用グラフのツールでは、画像が大きすぎることがあります。そこで、Preg 2.6からは、これらのツールで簡単に パンズーム の機能が使えるようになりました。

画像を パン するには,自由領域上でマウスの左ボタンを押し(ノード上ではなく),押したボタンを離さずにマウスをドラッグして移動させます.矩形選択モードでは、マウスボタンを押すと矩形が描画されるので、パンするには 矩形選択モード をオフにする必要があります。

画像を Zoom するには、マウスポインタを画像の上に置いた状態で、マウスホイールを使います。

シンタックスツリー

上で説明したように、正規表現は他の式と同様に、operatoroperandsのツリーです。シンタックスツリーは、式の内部構造をグラフィカルに表示します(何が何の中にあるか)。これは、正規表現を理解している場合や、学習中の場合に最も便利なツールとなります。

operatorsや優先順位の概念をよく理解していない場合は、ほとんど意味がないかもしれません。しかし、どこで括弧が必要なのかを知るには便利です。下の図のab+ (a) と(ab)+ (b)のツリーを比較してみてください。

parenthesis in the structure of regex

ツリーには、すべてのサブパターンの名前と番号が表示されますので、その数字を確認することができます - そして、それに対するバックリファレンスも。

numbered and named subpatterns in tree

選択した式の部分が緑色の四角で表示されます。'折りたたみモード' のチェックボックスがオフになっている場合、ツリーのノードを押して選択することができます。

part of the tree is selected

Preg 2.6以降、シンタックスツリーツールに '折りたたみモード' オプションが追加されました。'折りたたみモード' がオンになっていると、ツリーのノードを押すと、そのノードのすべての子ノードが1つの省略記号に折りたたまれます(以下の画像を参照)。折りたたまれたノードをもう一度押すと、折りたたまれた状態が解除されます。折りたたみモードをオフにすると、ノードの折りたたみは解除されませんが、通常の選択モードに戻ることができます。次の図では、折りたたまれた2つのノードがツールチップとともに表示されています。このツールチップには、ノードの1つの上に正規表現の折りたたまれた部分が表示されています。

collapsed tree

グラフの説明

グラフは、正規表現がどのように機能するかを示しています。ノードはマッチした文字であり,エッジはノードを経由して最初から最後までのパスを示します。 alternatives and concatenation

楕円形のノードは、個々のキャラクタ、キャラクタのシーケンス(グラフが極端に大きくならないように)、または単一の特殊なキャラクタクラス(この場合、線の色が変わる)を表します。複雑なキャラクタークラスは長方形で表示されます。単純なアサーションはノード間でチェックされるので、エッジに書かれています。

graph for regex ^\dabc[!,0-9]$

点線の長方形は、あなたが表現を繰り返した部分を示しています。

graph for regex \d*

実線の長方形はサブパターンを示します。expressionがマッチすると、文字列のどの部分が各サブパターンにマッチしたかを記憶します。これをフィードバックに挿入したり、expressionの後方参照に使ったりすることができます。サブパターンを記憶する必要がない場合は、( ) の代わりに (?: ) を使うとマッチングが早くなる。

de)f

緑色の四角形は、選択された表現の一部を示します。"矩形選択モード" をオンにすると、ゴム製の矩形を使ってグラフの一部を選択し、すべての機器で選択された正規表現の対応する部分を確認することができます(正規表現テキストを含む)。

selection in the tree and graph

説明

説明は、表現がどのように機能するかを説明する文章を形成しようとするものです。表現の選択部分は黄色の背景色で表示されます。

テストツール

ここに文字列を1行に1つずつ入力できます。これらの文字列は式と照合されます。文字列のどの部分が式にマッチしたかを示す色付きの文字列が表示されますので、期待通りに動作するかどうかをテストすることができます。また、正規表現全体にマッチした文字列には緑色のチェックマークが表示され、完全にマッチしなかった文字列には赤い十字が表示されます。PHPの preg matcher は部分的なマッチを表示することができないので、完全にマッチするか何も表示しません (文字列全体が間違っていると誤解されないようにするためです)。

正規表現の一部を選択した場合、文字列のどの部分がその部分にマッチするかを見ることができます (通常は黄色で表示されますが、これはテーマに依存するかもしれません)。FA matcher は正規表現のどの部分にもマッチすることを示しますが、 PHP の preg matcher はサブパターンの抽出のみを行います。

テスト用の文字列は、正規表現を保存した場合、データベースに保存されます("キャンセル" ボタンでウィンドウを閉じた場合は失われます)。

正規表現の理解

表現一般の理解

正規表現とは、他の 表現 と同様に、operatorとその operands を組み合わせたものです。心配しないでください。皆さんは子供の頃から算術式をマスターしてきましたが、正規表現も同じように簡単です。たった4つの新しい単語を覚える(または思い出す)だけで、あなたは非常に広い可能性を持った正規表現のマスターになります。さあ、始めましょう。

簡単な数学の式を見てみましょう : x+y*2です。operator には、'+'と'*'の2つがあります。'*' の operands は 'y' と '2' です。'+' の operands は 'x' と 'y*2' の結果です。簡単?

この表現をより深く考えると、演算子の 優先順位 に支配された明確な 評価の順番 があることがわかります。'*' は '+' よりも優先されるので、最初に評価されます。括弧を使えば評価の順番を変えることができます。(x+y)*2 は、'+' を先に評価し、結果を2倍します。 それでも簡単ですか?

operatorについて、もうひとつ知っておかなければならないことは、その arity です。これは、必要とされるoperandsの数にすぎません。上の例では '+' と '*' は バイナリー operator であり、どちらも2つのオペランドを取ります。ほとんどの算術演算子operatorは二項演算ですが、マイナスはこの式のようにアーナリー(1つのオペランド)形式もあります : y=-x。単項と二項のマイナスは動作が異なることに注意してください。

式は単なるレゴゲームで、operators の並びと、それぞれの operands の数(アリティ)を正しく設定し、優先順位 や括弧を使って評価の順番を決めるものです。算術式は数字を評価するためのものです。正規表現は文字列のパターンを見つけるためのものなので、当然他のオペランドや演算子を使用しますが、優先順位やアリティについては同じルールに従います。

正規表現

正規表現は、パターンを使って文字列を検索する強力なメカニズムです。正規表現の オペランド' は、特定の位置で許される文字または文字の集合です。A は、1つの文字 'A' にマッチする正規表現です。正規表現の operators は、パターン内の個々の文字を組み合わせる方法を定義しています : 連続(concatenation 演算子)、代替、繰り返し(これは quantifier と呼ばれています)。連結は非常にシンプルな演算子で、文字を一切必要としません。文字を連続して書くだけで連結されます。いくつかの文字を連続して書けば、それらは連結されます。しかし、問題によって、1つの文字を繰り返したいのか、連続した文字を繰り返したいのかがわかるように、優先順位はあります。代替案は縦棒で書かれます。量詞には多くの形式がありますが、最もよく使われるのはクエスチョンマーク(0または1回繰り返す)、アスタリスク(0または複数回)、プラス(1または複数回)です。中括弧で繰り返し回数の最小値と最大値を指定することもできますが、これも量的修飾子です。

operatorを定義する特殊文字は、オペランドとして使用する際にはバックスラッシュを先行させて エスケープ する必要があります。 数式では、オペランド(数値や変数)が演算子(+,-など)とは異なる文字で構成されているため、エスケープの問題はありませんが、マッチングのためのパターンを作成する際には、オペランドとして 任意の 文字を使用できるようにする必要があります。

文字クラスを使うと、1つの場所に複数の可能な文字を指定することができます。文字クラスは様々な方法で定義することができます。角括弧 [as3] による文字の列挙、角括弧 [a-z] による範囲指定、特殊なシーケンス(\d は任意の数字、\W は文字、数字、アンダースコア以外、[[:alpha:]] は任意の文字など)などです。オペランドの重要なタイプに 単純なアサーション があります。これは、文字列の開始 ^、文字列の終了 $、単語の境界 \b などの条件をテストすることができます。

オペランドとoperatorの一覧とより多くの例はリファレンスセクションにあります。