「Preg問題タイプ」の版間の差分

提供:MoodleDocs
移動先:案内検索
 
(同じ利用者による、間の22版が非表示)
34行目: 34行目:
様々な設定とその下での問題の動作を理解するために、[[#PREG問題の仕組み|問題の仕組み]]を読むべきです。また、[[#オーサリングツール|オーサリングツール]]のセクションの正規表現テストにも興味があるかもしれません。最後に、[[#正規表現リファレンス|正規表現リファレンス]]も参考になるかもしれません。
様々な設定とその下での問題の動作を理解するために、[[#PREG問題の仕組み|問題の仕組み]]を読むべきです。また、[[#オーサリングツール|オーサリングツール]]のセクションの正規表現テストにも興味があるかもしれません。最後に、[[#正規表現リファレンス|正規表現リファレンス]]も参考になるかもしれません。


==対応するMoodleブランチと翻訳==
==対応するMoodleブランチと翻訳==
このプラグインは、現在 (2018年4月) Moodleブランチ2.3から3.1のみで利用可能と記載されていますが、[https://moodle.org/plugins/stats.php?plugin=qtype_preg stats page] によると、このプラグインがインストールされている50以上のサイトのうち、半分は3.2から3.4のMoodleブランチです。公式にサポートされていないブランチでは、正規表現プラグインは動作しますが、[[#オーサリングツール|オーサリングツール]]は利用できません。プラグイン開発者は、このプラグインをアップデートし、この問題の原因となっているJavaScriptの問題を修正するために作業を行っています。DEVELOPERレベルのデバッグを有効にした場合、サーバに危険を及ぼさない警告が表示されることがあります。これらは将来のリリースで修正される予定です。
このプラグインは、現在 (2018年4月) Moodleブランチ2.3から3.1のみで利用可能と記載されていますが、[https://moodle.org/plugins/stats.php?plugin=qtype_preg 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
  Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP
90行目: 90行目:


===ヒント===
===ヒント===
ヒントは、[[Question_behaviours#How_questions_behave|adaptive and interactive behaviours]]のFAエンジンでサポートされています。
ヒントは、[[問題の動作#問題の動作|適応的および相互的動作]]のFAエンジンでサポートされています。


==== 部分一致====
==== 部分一致====
105行目: 105行目:


====一般的なヒントのルール====
====一般的なヒントのルール====
REGEXP [[Regular Expression Short-Answer question type]]とは異なり、Preg問題タイプはヒント文字を学生の解答に追加せず、いくつかの理由から別々に表示します。
REGEXP [[正規表現記述問題タイプ]]とは異なり、Preg問題タイプはヒント文字を学生の解答に追加せず、いくつかの理由から別々に表示します。
# 自分の解答にヒント文字を追加したいかどうかは学生の責任です (さらにいくつかの理由もあります)。
# 自分の解答にヒント文字を追加したいかどうかは学生の責任です (さらにいくつかの理由もあります)。
# 解答が修正されると、'''ヒント''' を繰り返し押すのが簡単になってしまうので、ヒントを考えるのがわずかに楽になりますが、これは通常望ましい行動ではありません。
# 解答が修正されると、'''ヒント''' を繰り返し押すのが簡単になってしまうので、ヒントを考えるのがわずかに楽になりますが、これは通常望ましい行動ではありません。
168行目: 168行目:


===なくなったもの、置き忘れたものを探す===
===なくなったもの、置き忘れたものを探す===
Joseph Rezeauによって作成された[[Regular Expression Short-Answer question type]](REGEXP)には '''missing words''' 機能があり、答えの中に何かが欠落している場合に機能する答えを定義することができます(そして学生に適切なフィードバックを与えることができます)。
Joseph Rezeauによって作成された[[正規表現記述問題タイプ]](REGEXP)には '''missing words''' 機能があり、答えの中に何かが欠落している場合に機能する答えを定義することができます(そして学生に適切なフィードバックを与えることができます)。


同様の効果は、''否定的な主張''とマッチング開始のアンカーを組み合わせることでも得られます。欠けている単語 '''necessary''' を探すための正規表現は
同様の効果は、''否定的な主張''とマッチング開始のアンカーを組み合わせることでも得られます。欠けている単語 '''necessary''' を探すための正規表現は
176行目: 176行目:
* '''^''' もアサーションで、マッチを解答の先頭に固定します(そうしないと、レスポンスの中で "necessary" という単語の後に、その単語があってもマッチが可能な場所ができてしまいます)。
* '''^''' もアサーションで、マッチを解答の先頭に固定します(そうしないと、レスポンスの中で "necessary" という単語の後に、その単語があってもマッチが可能な場所ができてしまいます)。


説明が難しい場合は、見つからない正規表現を '''^(?!)''' や ''')''' で囲んでください。'--' 構文は試さないでください。これはJoseph Rezeauによって作成された[[Regular Expression Short-Answer question type]](REGEXP)に特有のものです!
説明が難しい場合は、見つからない正規表現を '''^(?!)''' や ''')''' で囲んでください。'--' 構文は試さないでください。これはJoseph Rezeauによって作成された[[正規表現記述問題タイプ]](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(?###>)
 
テンプレートは、正規表現をより短く、理解しやすくするために使用することができます。特に複雑な正規表現(通常は括弧を含むもの)については、[[Preg問題タイプ#Settings_affecting_question_work|extended notation]]を使用して、改行やスペースを使用して正規表現をより適切にフォーマットできるようにすることを検討してください。
 
今のところ、テンプレートはPreg問題タイプにハードコードされていますが、次のリリースでは、ユーザのカスタムテンプレートのサポートを追加する予定です。
 
現時点では、以下のテンプレートが利用可能です。
{| class="wikitable"
|-
! 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] <nowiki>[[cat]]</nowiki>
|-
| 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] <nowiki>[[[Fido]]]</nowiki>
|-
| 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)))))" などにマッチします。
 
==オーサリングツール==
オーサリングツールは、正規表現を書いたり、テストしたり、理解したりするのに役立ちます。ツールは、書かれた正規表現(およびその部分)の意味を示し、それをテストすることができます。
 
オーサリングツールは、正規表現フィールドの近くにある "編集" アイコン(歯車)を押すと起動します。
 
[[File:regex authoring tools editor.png|200px]]
 
{{Note|オーサリングツールを開くために歯車をクリックすると、ポップアップウィンドウのタイトルが 'Regex constructor' になっています。}}
 
Regexコンストラクタでオーサリングツールを完全に使用したい場合、オープンソースの[https://www.graphviz.org/ Graphviz]グラフビジュアライゼーションソフトウェアをインストールして、Moodleサーバの 'サイト管理 ► サーバ ► システムパス ► Path to dot' に 'path to dot' (WindowsではC:\Program Files (x86)\Graphviz2.38\bin\dot.exe) を設定する必要があります。
 
[[File:preg pathtodot.png|500px]]
 
Syntax Tree や Explaining Graph ツールを描画するためには、グラフ可視化ソフトウェア [https://www.graphviz.org/ Graphviz] が必要です。
 
[[Image:qtype preg authortools1.png|authoring tools icon]]
 
Regexコンストラクタには4つのツールが用意されています。
;'''シンタックスツリー''' : 正規表現の内部構造を表示します。
;'''説明用のグラフ''' : 表現がどのように機能するかを図解しています。
;'''説明''' : 表現の意味を英語で表現します。
;'''テストツール''' : 文字列を入力して、それが正規表現にどのようにマッチするかを見ることができます。
 
===インストール時の注意点と既知の技術的問題===
''シンタックスツリー'' および ''説明用グラフ'' [[#オーサリングツール|オーサリングツール]]を動作させるには、[https://www.graphviz.org/ 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では別のものを使用する必要があります。
 
===正規表現エリア===
ここでは、正規表現を編集することができます。"表示" をクリックすると、すべてのツールに正規表現が送信され、シンタックスツリー、説明用グラフ、説明文、テスト結果が更新されます。"保存" をクリックすると、オーサリングツールのフォームが閉じられ、メインの問題編集フォームに正規表現とテスト文字列が保存されます。"キャンセル" は、オーサリングツールフォームを閉じ、そこで行われたすべての変更を破棄します。
 
ここで正規表現の一部を選択すると、構文ツリー、説明グラフ、説明、文字列のマッチした部分の対応する部分がハイライトされます。正規表現の論理的に完成された部分に対応していない正規表現テキストの一部を選択することができます。その場合、選択範囲は、最も近い論理的に完成された部分に拡大されます。
 
===マッチングオプション===
ここでは、マッチングに影響を与えるオプション(マッチングエンジン、正規表現、完全一致、大文字小文字の区別)を変更できます。
* '''マッチングエンジン''' は、マッチングを行うコードを変更するもので、自分のニーズに合っているかどうか、テストツールを使って確認することができます。
* '''正規表現記法''' は正規表現の書き方を変えます - すべての器具は、この記法がどのように解釈されるかの違いを示します。
* 大文字小文字を区別しないノードはグレー、大文字小文字を区別するノードは白になります。
* '''完全一致''' では、学生の解答全体が一致するように、正規表現に新しい部分を追加します。これらの追加された部分はツールの中でグレーの背景で表示されます - 以下の図を参照してください。
[[Image:qtype preg authortools9.png|exact matching]]
 
===写真のパンおよびズーム===
シンタックスツリーや説明用グラフのツールでは、画像が大きすぎることがあります。そこで、Preg 2.6からは、これらのツールで簡単に ''パン'' と ''ズーム'' の機能が使えるようになりました。
 
画像を '''パン''' するには,自由領域上でマウスの左ボタンを押し(ノード上ではなく),押したボタンを離さずにマウスをドラッグして移動させます.矩形選択モードでは、マウスボタンを押すと矩形が描画されるので、パンするには ''矩形選択モード'' をオフにする必要があります。
 
画像を '''Zoom''' するには、マウスポインタを画像の上に置いた状態で、マウスホイールを使います。
 
===シンタックスツリー===
上で説明したように、正規表現は他の式と同様に、[https://en.wikipedia.org/wiki/Operator_(computer_programming) operator]と[https://en.wikipedia.org/wiki/Operand operands]のツリーです。シンタックスツリーは、式の内部構造をグラフィカルに表示します(何が何の中にあるか)。これは、正規表現を理解している場合や、[[#正規表現の理解|学習中]]の場合に最も便利なツールとなります。
 
[https://en.wikipedia.org/wiki/Operator_(computer_programming) operators]や優先順位の概念をよく理解していない場合は、ほとんど意味がないかもしれません。しかし、どこで括弧が必要なのかを知るには便利です。下の図の''ab+'' (a) と''(ab)+'' (b)のツリーを比較してみてください。
 
[[Image:qtype preg authortools2.png|parenthesis in the structure of regex]]
 
ツリーには、すべてのサブパターンの名前と番号が表示されますので、その数字を確認することができます - そして、それに対するバックリファレンスも。
 
[[Image:qtype preg authortools8.png|numbered and named subpatterns in tree]]
 
選択した式の部分が緑色の四角で表示されます。'折りたたみモード' のチェックボックスがオフになっている場合、ツリーのノードを押して選択することができます。
 
[[Image:qtype preg authortools3.jpg|part of the tree is selected]]
 
Preg 2.6以降、シンタックスツリーツールに '折りたたみモード' オプションが追加されました。'折りたたみモード' がオンになっていると、ツリーのノードを押すと、そのノードのすべての子ノードが1つの省略記号に折りたたまれます(以下の画像を参照)。折りたたまれたノードをもう一度押すと、折りたたまれた状態が解除されます。折りたたみモードをオフにすると、ノードの折りたたみは解除されませんが、通常の選択モードに戻ることができます。次の図では、折りたたまれた2つのノードがツールチップとともに表示されています。このツールチップには、ノードの1つの上に正規表現の折りたたまれた部分が表示されています。
 
[[Image:qtype preg authortools12.jpg|collapsed tree]]
 
===グラフの説明===
グラフは、正規表現がどのように機能するかを示しています。ノードはマッチした文字であり,エッジはノードを経由して最初から最後までのパスを示します。
[[Image:qtype preg authortools4.png|alternatives and concatenation]]
 
楕円形のノードは、個々のキャラクタ、キャラクタのシーケンス(グラフが極端に大きくならないように)、または単一の特殊なキャラクタクラス(この場合、線の色が変わる)を表します。複雑なキャラクタークラスは長方形で表示されます。単純なアサーションはノード間でチェックされるので、エッジに書かれています。
 
[[Image:qtype preg authortools5.jpg|graph for regex ^\dabc[!,0-9]$]]
 
点線の長方形は、あなたが表現を繰り返した部分を示しています。
 
[[Image:qtype preg authortools6.jpg|graph for regex \d*]]
 
実線の長方形はサブパターンを示します。expressionがマッチすると、文字列のどの部分が各サブパターンにマッチしたかを記憶します。これをフィードバックに挿入したり、expressionの後方参照に使ったりすることができます。サブパターンを記憶する必要がない場合は、( ) の代わりに (?: ) を使うとマッチングが早くなる。
 
[[Image:qtype preg authortools71.png|graph for regex (?:(abc)|de)f ]]
 
緑色の四角形は、選択された表現の一部を示します。"矩形選択モード" をオンにすると、ゴム製の矩形を使ってグラフの一部を選択し、すべての機器で選択された正規表現の対応する部分を確認することができます(正規表現テキストを含む)。
 
[[Image:qtype preg authortools11.png|selection in the tree and graph ]]
 
===説明===
説明は、表現がどのように機能するかを説明する文章を形成しようとするものです。表現の選択部分は黄色の背景色で表示されます。
 
===テストツール===
ここに文字列を1行に1つずつ入力できます。これらの文字列は式と照合されます。文字列のどの部分が式にマッチしたかを示す色付きの文字列が表示されますので、期待通りに動作するかどうかをテストすることができます。また、正規表現全体にマッチした文字列には緑色のチェックマークが表示され、完全にマッチしなかった文字列には赤い十字が表示されます。PHPの preg matcher は部分的なマッチを表示することができないので、完全にマッチするか何も表示しません (文字列全体が間違っていると誤解されないようにするためです)。
 
正規表現の一部を選択した場合、文字列のどの部分がその部分にマッチするかを見ることができます (通常は黄色で表示されますが、これはテーマに依存するかもしれません)。FA matcher は正規表現のどの部分にもマッチすることを示しますが、 PHP の preg matcher はサブパターンの抽出のみを行います。
 
テスト用の文字列は、正規表現を保存した場合、データベースに保存されます("キャンセル" ボタンでウィンドウを閉じた場合は失われます)。
 
==正規表現の理解==
 
===表現一般の理解===
正規表現とは、他の '''表現''' と同様に、'''[https://en.wikipedia.org/wiki/Operator_(computer_programming) operator]'''とその '''[https://en.wikipedia.org/wiki/Operand operands]''' を組み合わせたものです。心配しないでください。皆さんは子供の頃から算術式をマスターしてきましたが、正規表現も同じように簡単です。たった4つの新しい単語を覚える(または思い出す)だけで、あなたは非常に広い可能性を持った正規表現のマスターになります。さあ、始めましょう。
 
簡単な数学の式を見てみましょう : '''x+y*2'''です。'''[https://en.wikipedia.org/wiki/Operator_(computer_programming) operator]''' には、'+'と'*'の2つがあります。'*' の '''[https://en.wikipedia.org/wiki/Operand operands]''' は 'y' と '2' です。'+' の '''operands''' は 'x' と 'y*2' の結果です。簡単?
 
この表現をより深く考えると、演算子の '''優先順位''' に支配された明確な '''評価の順番''' があることがわかります。'*' は '+' よりも優先されるので、最初に評価されます。括弧を使えば評価の順番を変えることができます。'''(x+y)*2''' は、'+' を先に評価し、結果を2倍します。 それでも簡単ですか?
 
[https://en.wikipedia.org/wiki/Operator_(computer_programming) operator]について、もうひとつ知っておかなければならないことは、その '''arity''' です。これは、必要とされる[https://en.wikipedia.org/wiki/Operand operands]の数にすぎません。上の例では '+' と '*' は '''バイナリー''' [https://en.wikipedia.org/wiki/Operator_(computer_programming) operator] であり、どちらも2つのオペランドを取ります。ほとんどの算術演算子[https://en.wikipedia.org/wiki/Operator_(computer_programming) operator]は二項演算ですが、マイナスはこの式のように'''アーナリー'''(1つのオペランド)形式もあります : '''y=-x'''。単項と二項のマイナスは動作が異なることに注意してください。
 
式は単なるレゴゲームで、'''[https://en.wikipedia.org/wiki/Operator_(computer_programming) operators]''' の並びと、それぞれの '''[https://en.wikipedia.org/wiki/Operand operands]''' の数(アリティ)を正しく設定し、'''優先順位''' や括弧を使って評価の順番を決めるものです。算術式は数字を評価するためのものです。正規表現は文字列のパターンを見つけるためのものなので、当然他のオペランドや演算子を使用しますが、優先順位やアリティについては同じルールに従います。
 
===正規表現===
正規表現は、パターンを使って文字列を検索する強力なメカニズムです。正規表現の '''オペランド''' は、特定の位置で許される文字または文字の集合です。'''A''' は、1つの文字 'A' にマッチする正規表現です。正規表現の ''[https://en.wikipedia.org/wiki/Operator_(computer_programming) operators]''' は、パターン内の個々の文字を組み合わせる方法を定義しています : 連続(''concatenation'' 演算子)、代替、繰り返し(これは ''quantifier'' と呼ばれています)。連結は非常にシンプルな演算子で、文字を一切必要としません。文字を連続して書くだけで連結されます。いくつかの文字を連続して書けば、それらは連結されます。しかし、問題によって、1つの文字を繰り返したいのか、連続した文字を繰り返したいのかがわかるように、優先順位はあります。代替案は縦棒で書かれます。量詞には多くの形式がありますが、最もよく使われるのはクエスチョンマーク(0または1回繰り返す)、アスタリスク(0または複数回)、プラス(1または複数回)です。中括弧で繰り返し回数の最小値と最大値を指定することもできますが、これも量的修飾子です。
 
[https://en.wikipedia.org/wiki/Operator_(computer_programming) operator]を定義する特殊文字は、オペランドとして使用する際にはバックスラッシュを先行させて '''エスケープ''' する必要があります。 数式では、オペランド(数値や変数)が演算子(+,-など)とは異なる文字で構成されているため、エスケープの問題はありませんが、マッチングのためのパターンを作成する際には、オペランドとして ''任意の'' 文字を使用できるようにする必要があります。
 
文字クラスを使うと、1つの場所に複数の可能な文字を指定することができます。文字クラスは様々な方法で定義することができます。角括弧 '''[as3]''' による文字の列挙、角括弧 '''[a-z]''' による範囲指定、特殊なシーケンス('''\d''' は任意の数字、'''\W''' は文字、数字、アンダースコア以外、'''<nowiki>[[:alpha:]]</nowiki>''' は任意の文字など)などです。オペランドの重要なタイプに ''単純なアサーション'' があります。これは、文字列の開始 '''^'''、文字列の終了 '''$'''、単語の境界 '''\b''' などの条件をテストすることができます。
 
オペランドと[https://en.wikipedia.org/wiki/Operator_(computer_programming) operator]の一覧とより多くの例は[[#正規表現リファレンス|リファレンス]]セクションにあります。
 
===評価の優先順位と順序===
'''数量詞''' は '''連結''' よりも優先され、'''連結''' は '''代替''' よりも優先されます。その意味を見てみましょう。
# ''quantifiers over concatenation'' とは、量詞が最初に実行されることを意味し、括弧なしで使用された場合は1文字のみを繰り返します。
#* "many times*" は "manytime" の後に 0 個以上の "s" が続く場合にマッチします。
#* "(many times)*" は、"many times" に0回以上マッチします - 前述の正規表現を括弧を使って変更することで、文字列の繰り返しを定義することができます。
# ''concatenation over alternative'' とは、複数文字の代替案を括弧なしで定義できることを意味します(1文字の代替案の場合は、代替演算子ではなく文字クラスを使用するのが良いでしょう)。
#* "first|second|third" は、"first" または "second" または "third" にマッチします。
#* "(first |second |)part" は、"first part" や "second part"、あるいは単なる "part" にマッチします。これは、空の代替案の典型的な使用方法です(単なる "part" の前にスペースを必要としないように、代替案にスペースが入っていることに注意してください)。
# ''quantifier over alternative''とは、括弧を使って代替集合を繰り返すことを意味します。
#* "first|second*" は "first" または "secon" の後に "secondddd" のように 0個以上の "d" が続く場合にマッチします。
#* "(first|second)*" は、"first" または "second" に0回以上、任意の順序で繰り返されるものにマッチします("firstsecondfirstfirst")。量詞は選択肢全体を繰り返すのであって、その中から特定のものを選ぶわけではないことに注意してください。
#* "(1|2){2}" は "11" や "12" や "21" や "22" にマッチしますが、"11" や "22" だけにはマッチしません。
#* "1{2}|2{2}" は "11" または "22" のみにマッチします。
 
正規表現の内部構造は、[[#シンタックスツリー|シンタックスツリー]](オーサリングツール)でよく見ることができます。最初に実行された演算子はツリーの下(水平方向では右)に配置され、最後に実行された演算子はツリーのルートになります。このセクションがよくわからない場合は、オーサリングツールで上の例のツリーと説明のグラフを比較することができます。正規表現演算子の "実行" とは、文字列の中でそれらをリンクさせることを意味することを覚えておいてください : 逐次リンク、代替リンク、リピート。
 
===アンカーリング===
アンカーリングは簡単なアサーションを使用して、マッチングプロセスに制限を設けるために使用されます。
* 正規表現が '''^'' で始まる場合、マッチは学生の解答の最初から始まります。
* 正規表現が '''$''' で終わる場合、マッチは学生の解答の最後で終了します。
* それ以外の場合、正規表現は学生の解答のどこにでもマッチします。
 
単純なアサーションは正規表現と連結され、連結は代替表現よりも優先されるため、使い方が少し難しいことに注意してください。
* "^start|end$" は、文字列の先頭の "start" または末尾の "end" にマッチします。
* "^(start|end)$" 括弧を使って、"start" または "end" に正確にマッチします。
* "^start$|^end$" は、完全に一致させる別の方法です(すべてのトップレベルの代替案はアンカーされます)。
 
'''完全一致''' オプションを "yes" に設定すると(これがデフォルト値です)、問題はあなたに代わって各正規表現に ^ と $ を追加します(サブパターンの使用には影響しません)。しかし、一般的なエラーを検出してフィードバックを行うために、いくつかのアンカーなしの正規表現を使用し、評定のために手動でアンカー付きの表現を使用することを好むかもしれません。
 
==標準的なMoodleの[[記述問題タイプ]]のより良い代替品として正規表現を使用した例==
文字や単語のヒントを表示する機能により、preg問題タイプは、形成的な小テストのための非常に強力で使いやすいツールとなっています。
 
* ボキャブラリーの練習
** [[Preg問題タイプの例#太陽系の例|太陽系の例]]
** [[Preg問題タイプの例#医学用語の例|医学用語の例]]
 
*センテンスの暗記
** [[Preg問題タイプの例#法律の一条の例|法律の一条の例]]
** [[Preg問題タイプの例#大きな段落の冒頭に合わせる例|大きな段落の冒頭に合わせる例]]
 
==正規表現リファレンス==
 
===オペランド===
ここでは、文字セットを定義するオペランドの不完全なリストを紹介します。
#'''単純な文字'''(特別な意味を持たない)は自分自身にマッチします。
#'''エスケープされた特殊文字''' は、対応する特殊文字と一致します。エスケープとは、特殊文字の前にバックスラッシュ "\" を付けることです。例えば、正規表現 "\|" は文字列 "|" にマッチし、正規表現 "a\*b\[" は文字列 "a*b[" にマッチします。バックスラッシュも特殊文字ですので、エスケープしてください。"\\" は "\" に一致します。
#* エスケープが必要な文字の全リスト '''[ ] | ( ) ? * + { }'''
#* '''注意!''' ある文字をエスケープするかどうか迷ったときは、文字と数字以外の文字の前に "\" を置くのが安全です。文字や数字は、エスケープされると特別な意味を持ち、エスケープされないと意味を失います。
#* エスケープが必要な文字が多すぎる場合は、'''Q .... \E''' のシーケンスを使うことができます。QからEの間は、文字通り文字として扱われます。
#** "\Q^(abc)$\E." は、"^(abc)$" の後に任意の文字が続く場合にマッチします。
#** "\Q^(abc)$." は "^(abc)$." にマッチします。"\E" がないため、"\Q" 以降の文字は、正規表現の最後までリテラルとして扱われます。
#'''ドットメタ文字''' (".") は ''あらゆる'' 可能な文字にマッチします (改行を除くが、学生はどこにも入力できません)。もし単一のドットにマッチする必要があるなら、"\." とエスケープします。文字クラスの中では特別な意味を失います。
# '''文字クラス''' は、その中に定義されている任意の文字にマッチします。文字クラスは角括弧で定義されます。文字クラスを定義する特定の方法は次のとおりです。
#* "[ab,!]" は、"a"、"b"、"," 、"!" のいずれかにマッチします。
#* "[a-szC-F0-9]" は、"a-z"、"C-F"、"0-9" の範囲 (2文字間のハイフンで定義) に、"z" という1文字を加えたもので、"a" から "s"、"z"、"C" から "F"、"0" から "9" までのすべての文字にマッチします。
#* "[^a-z-]" は、"^" で始まり、"a" から "z" と "-" を除くすべての文字にマッチします(2つ目のハイフンは2つの文字の間に置かれていないため、それ自体が定義されていることに注意してください)。
#* "[\-\] \\]" には "文字セット内でのエスケープ" が含まれます。"-"、 "]"、"\" と一致します。他の文字は文字セット内で特別な意味を失い、エスケープすることはできませんが、文字セットに "^" を含めたい場合は、最初にそこに置くべきではありません。
# '''エスケープシーケンス''' は、一般的な文字セットのためのものです(文字クラスの内側でも外側でも使用できます)。
単語を表す文字 (アルファベット、アンダースコア、数字) は "\w"、単語以外の文字は"\W "となります。
#* スペース (空白) を表す "\s" と、スペース以外の文字を表す "\S"。
#* "\d" は数字を表し、"\D" は非数字を表します。
# '''Unicodeプロパティ''' は、文字クラスの内部または外部の両方で使用できる特定のUnicode文字を照合するための特別なエスケープシーケンス "\p{xx}" (正) または "\P{xx}" (負) です ("xx" バリエーションの完全なリストは、http://www.nusphere.com/kb/phpmanual/reference.pcre.pattern.syntax.htmにあります)。
#* "\p{Ll}" は任意の小文字に一致します。
#* "\P{Lu}" は、大文字以外の文字と一致します。
# '''POSIX character classes''' は、unicodeのプロパティと同じ目的で使用されますが、非ASCII文字では動作しない場合があります(完全なリストもインターネット上にあります)。これらは文字クラスの内部でのみ使用できます。
#* <nowiki>"[[:alnum:]]"</nowiki>は、任意の英数字にマッチします。
#* <nowiki>"[[:^digit:]]"</nowiki>は、数字以外の任意の文字にマッチします。
# '''単純なアサーション''' とは、文字ではなくテストするための条件であり、他のオペランド (文字クラスの外でのみ意味を持つ) とは異なり、マッチングの際に文字を ''消費'' しません。
#* "^" は文字列の先頭にマッチし、それ以外は失敗します。
#* "$" は文字列の最後にマッチし、それ以外は失敗します。
#* "\b "は、単語の境界、つまり、単語 (\w) と非単語 (\W) の間、または、文字列が単語で始まる (終わる) 場合は、文字列の開始 (終了) 部分にマッチします。
#* "\B" は単語の境界線上にないため、"\b" に否定的です。
 
しかし、1文字にしかマッチしないパターンはあまり便利ではありません。そこで、複数の文字にマッチする式を定義するための '''演算子''' が登場します。
 
===演算子===
ここでは、一般的な正規表現の演算子をご紹介します。
'''Concatenation''' - 特別な文字の定義を必要としない、とてもシンプルな ''二項演算子'' です。演算子であることに変わりはなく、優先順位があります。これは、どこでブラケットを使用するかを理解する上で重要です。連結演算では、複数の演算子を連続して記述することができます。
#* "ab" は "ab" と一致します。
#* "a[0-9]" は、"a" の後に任意の数字が続く場合にマッチします。
# '''Alternative'' - 選択肢のセットを定義できる ''二項演算子'' です。
#* "a|b" は "a" または "b" にマッチします。
#* "ab|cd|de" は、"ab" または "cd" または "de" にマッチします。
#* "ab|cd|" は、"ab" や "cd"、または ''emptiness'' にマッチします(より複雑な表現のパーツとして便利です)。
#* "(aa|bb)c" は "aac" または "bbc" と一致します - 括弧を使って代替セットの概要を示しています。
#* "(aa|bb|)c "は、"aac" や "bbc"、"c" などの典型的な空虚さの使い方にマッチします。
# '''Quantifiers''' - オペランドとして使われる何かの繰り返しを定義できる ''単項'' 演算子です。
#* "x*" は "x" に0回以上一致します。
#* "x+"は "x "に1回以上合致します。
#* "x?" は "x" に0回または1回マッチします。
#* "x{2,4}" は "x" に2回から4回までマッチします。
#* "x{2,}" は "x" に2回以上一致します。
#* "x{,2}" は0回から2回まで "x" に一致します。
#* "x{2}" は "x" に2回だけマッチします。
#* "(ab)*"は "ab" に0回以上マッチします。つまり、複数の文字に量詞を使用したい場合は、括弧を使用する必要があります。
#* "(a|b){2}" は、"aa" または "ab" または "ba" または "bb" にマッチします。つまり、"a" または "b" の繰り返しではなく、繰り返される代替案です。
 
===サブパターンと後方参照===
'''サブパターン''' とは、正規表現で取り込まれた部分文字列を ''記憶'' する '''演算子'''です。サブパターンを定義する最も簡単な方法は、括弧を使うことです : 正規表現 "a(bc)d" はサブパターン "bc" を含んでいます。サブパターンは、正規表現全体の0から数えて、開いた括弧でカウントされます。この "(bc)" というサブパターンは1番目です。例えば "a(b(c)(d))e" と書いた場合、1番目のサブパターン "bcd"、2番目のサブパターン "c"、3番目のサブパターン "d" があります。
サブパターンは通常、番号を持つ '''後方参照''' と一緒に使われます。後方参照とは、同じ番号のサブパターンがマッチするのと同じ文字列にマッチする '''オペランド''' のことです。後方参照の最も簡単な構文は、スラッシュの後に数字を続けることです。"\1" は、第1サブパターンへの後方参照を意味します。正規表現 "([ab])\1" は、文字列 "aa" と "bb" にはマッチしますが、"ab" と "ba" にはマッチしません。なぜなら、後方参照はサブパターンがマッチしたのと同じ文字にマッチしなければならないからです。
C言語での整数変数の宣言・初期化を例に説明します。
* "int ([_\w][_\w\d]*); \1 = -?\d+;" は、例えば、"int _var; _var = -10; "のようにマッチします。もちろん、"int" と変数名などの間にはいくらでもスペースを入れることができますので、より正しい正規表現は以下のようになります。
* "\s*int\s+([_\w][_\w\d]*)\s*;\s*\1\s*=\s*-?\d+\s*;\s*" とすると、例えば "int var2 ; var2=123 ; " にマッチします。ちょっと怖そうですが、後から理解しようとするよりも、一度この正規表現を書いてしまった方が楽です。
 
最後に、サブパターンと後方参照は、単なる数字ではなく、もう少し複雑な構文で名前を持つことができます。
# "(?<name1>...)" は、名前が "name1" のサブパターンを意味します。
# "(?'name2'...)" は名前が "name2" のサブパターンを意味する。
# "(?P<name3>...)" は名前が "name3" のサブパターンを意味する。
# "\k<name4>" は、"name4" というサブパターンへの後方参照を意味する。
# "\k'name5" は "name5" というサブパターンへの後方参照を意味する。
# "\g{name6}" は "name6" というサブパターンへの後方参照を意味する。
# "\k{name7}" は "name7" というサブパターンへの後方参照を意味する。
# "(?P=name8)" は、"name8" というサブパターンへの後方参照を意味する。
これは、複雑な正規表現を扱い、サブパターンを追加したり削除したりして修正することが多い場合に非常に便利ですが、名前は変わりません。
 
====サブパターンの番号と名前の重複====
サブパターンとオルタネーションを組み合わせる際に便利な構文があります。もし "(?|...)" というグループを作ると、そのグループ内のすべての代替パターンは同じサブパターン番号を持つことになります。正規表現 "(?|(a(b))|(c(d))" を考えてみましょう。) - 2つの選択肢があり、それぞれに2つのサブパターンがあります。サブパターン "ab" と "cd" が1番目のもので、"b" と "d" が2番目のものです。
 
===サブパターンの呼び出し===
サブパターンを使用するもうひとつの方法は、サブパターンを呼び出すことです。サブパターンの呼び出しにヒットすると、マッチングエンジンは対象となるサブパターンの先頭に行き、その最後 (正規表現全体の最後ではない) まで繰り返しマッチングを開始します。サブパターンコールが参照するサブパターンの外側に配置されている場合、サブパターンの番号を除いて、そのサブパターンをコピーペーストしたのとほぼ同じことになります (番号は変わりません)。
 
サブパターンコールの最も一般的な使い方は、括弧の中の文字列を照合する問題で、無制限の括弧の入れ子が可能です。再帰的なサブパターンコールがなければ、任意の入れ子の深さを扱うことはできません。任意の入れ子のための正規表現は非常に複雑であり、積極的に使用すると非常に不明瞭な正規表現になってしまう可能性があることに注意してください。Preg問題イプでは、括弧を使った正規表現をより読みやすく、書きやすくするために、いくつかの[[Preg問題タイプ#テンプレート|テンプレート]]を提供しています。
 
サブパターンの呼び出しの構文は:
* (?R) パターン全体の再帰呼び出し
* (?n) サブパターンを絶対番号で呼び出す
* (?+n) 相対番号でサブパターンを呼び出す
* (?-n) 相対番号によるサブパターンの呼び出し
* (?&name) 名前でサブパターンを呼び出す
* (?P>name) 名前でサブパターンを呼び出す
* \g<name> 名前でサブパターンを呼び出す
* \g'name' 名前でサブパターンを呼び出す
* \g<n> 絶対数によるサブパターンの呼び出し
* \g'n'  絶対数によるサブパターンの呼び出し
 
最初のものは明示的に再帰的です。残りのバリアントは、それらが参照するサブパターンの中に置かれた場合、再帰を引き起こします。"a(b(?1)?c)d" は再帰を含み、"a(bc)(?1)d" は含みません。
 
有限状態オートマトン・エンジンを使用している場合、サブパターンの呼び出しは[https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions PCRE]とは若干異なる動作をしますが、呼び出されたサブパターンはアトミック・グループとして扱われません。一般的に、Preg問題タイプに実装されている動作は、より直感的で便利です。詳しくは、[https://en.wikipedia.org/wiki/Perl_Compatible_Regular_Expressions PCRE]のドキュメントをご覧ください。
 
===条件付きサブパターン===
条件付きサブパターンを使うと、"if-then-else" のような構造を書くことができます。基本的に、条件付きサブパターンは、条件、正の分岐、任意の負の分岐から構成されます。負の分岐が明示されていない場合は、(?:)のように空であるとみなされます。
一般的な構文は以下の通りです。"(?(condition)yes-pattern)" または "(?(condition)yes-pattern|no-pattern)" となります。
 
より具体的な選択肢としては:
* (?(n)...絶対的な参照条件 - n'th サブパターンが捕捉されているか?
* (?(+n)...相対的参照条件
* (?(-n)...相対的参照条件
* (?(<name>)...名前付き参照条件 - 与えられた名前のサブパターンがキャプチャされているか?
* (?('name')...名前付き参照条件
* (?(name))...名前付き参照条件
* (?(R)... 全体的な再帰条件 - 'R' という名前のサブパターンが存在しない場合、パターン全体またはサブパターンへの再帰呼び出しが行われた場合に条件が真となります。
* (?(Rn)...特定のグループの再帰条件 - 最新の再帰がn番目のサブパターンであれば条件は真となります。
* (?(R&name)...特定の再帰条件 - 直近の再帰が、与えられた名前のサブパターンに入っていれば、条件は真となります。
* (?(DEFINE)...参照用サブパターンの定義
* (?(assert)...複雑なアサーション条件 - アサーション (正/負の先読み/後読み) が一致した場合に条件が真となる。
 
"トップレベル" では、これらの再帰テスト条件はすべて偽です。
 
後者の条件付きサブパターンは、まだFAエンジンではサポートされていません。
 
===複雑なアサーション===
文字列の一部に関するアサーションは、実際にはマッチングテキストには入らず、マッチングの発生に影響を与えます:
* '''positive lookahead assertion''' "a+(?=b) "は、"b" を含むことなく、"b" で終わる "a" の任意の数にマッチします。
* '''negative lookahead assertion''' "a+(?!b)" は、"b" が続かない "a" の任意の数にマッチします。
* '''positive lookbehind assertion''' は、"a" の前に "b" を付けた任意の数にマッチします。
* '''negative lookbehind assertion''' "(?<!b)a+"は、"b" が先行していない "a" の任意の数にマッチします。
 
===ローカルな大文字小文字の区別の修飾子===
Preg 2.1以降では、Perlと互換性のある正規表現の標準的な構文を使用して、正規表現の一部に大文字小文字の区別を設定することができます。
* "(?i)" は、大文字小文字の区別をオフにします。
* "(?-i)" は、大文字小文字の区別をオンにします。
これは、問題レベルで選択される一般的な大文字小文字の区別に影響します。そのため、いくつかの回答では大文字と小文字を区別し、いくつかの回答では大文字と小文字を区別しないようにすることができますし、回答の一部に対してもこのようにすることができます。例えば、問題を "ユースケース" に設定し、"(?i)" で始まる50%の解答を用意して、ケースが一致しないが他はすべて正しい場合には評価を下げることができます。
 
ローカル修飾語は、括弧内に配置された場合、最も近い ")" まで動作します。トップレベル (括弧の中ではない) に置かれた場合は、式の最後まで動作します:
* "abc(de(?i)'''gh'')xyz" は、太字部分の大文字・小文字を区別しません。
* "abc(de)(?i)'''ghxyz''"は、太字部分の大文字・小文字を区別しません。
 
===エラーレポート===
ネイティブのPHP preg拡張関数は、正規表現にエラーがあるかどうかを報告するだけなので、'''PHP preg拡張''' エンジンでは、エラーについてあまり知ることができません。
 
'''FA''' エンジンは、カスタムの '''正規表現パーサ''' を使用しているため、高度なエラー報告をサポートしています。潜在的なエラーにはいくつかの種類があります:
* 条件付きサブパターン "(?(?=f)first|second|third)" の中に2つ以上のトップレベルの選択肢がある場合。
* 開かれていない閉じ括弧 "abc)"。
* あらゆる種類の閉じられていない開始括弧 (サブパターン、アサーションなど)) "(?:qwerty"。
* オペランドを持たない量詞、つまり、"+" や "a(+)" を繰り返すことのない (副) 式の最初にあるもの。
* 文字クラスの閉じていない括弧 "[a-fA-F\d"。
* 同一の修飾語を同時に設定また解除する場合 "(?i-i)";
* 未知の unicode プロパティ "\p{Squirrel}"。
* 未知の posix クラス <nowiki>"[[:hamster:]]"</nowiki>。
* 不明な (*...) シーケンス "(*QWERTY)"。
* 不正な文字セットの範囲 "[z-a]";
* 不正な量詞の範囲 "{5,3}";
* \パターンの最後にある "ab\"。
* \パターンの最後にある "ab\c"。
* 無効なエスケープシーケンス。
* 文字セット "[:digit:]" の外側にあるPOSIXクラス。
* 未定義のサブパターン (abc)\2 への参照。
* 不明、間違っている、またはサポートされていない修飾子 "(?z)"。
* missing ) コメント後の "(?#comment";
* 条件付きのサブパターン名の末尾がない。
* missing ) の後に (?C;
* サブパターン名の末尾がない。
* 後方参照名の末尾がない。
* 欠落している後方参照名の先頭。
* 制御シーケンスの後に ) がない。
* 誤った条件のサブパターン番号、数字が期待されます。
* アサーションまたは条件として "(?()a|b)" が期待されます。
* 文字コードが大きすぎる "\x{ffffffff}"。
* 文字コードは許可されていません "\x{d800}"。
* 無効な条件 (?(0)。
* (?C...) の数字が大きすぎるため、"(?C256)" となります。
* 2つの名前のついたサブパターンが同じ名前 "(?<name>a)(?<name>b)" である場合。
* "abc_g{0}" という表現全体への後方参照。
* 同じ番号のサブパターンに対して、異なるサブパターン名 "(?|(?<name1>a)|(?<name2>b))"。
* サブパターン名として "(?<>abc)" が予想されました。
* \c の後には、ASCII文字 "\cй" を続ける必要があります。
* \L、\l、\N{name}、\U、および \u はサポートされていません。
* (?< の後の認識されない文字。
 
==著者==
#アイデア、デザイン、問題の種類と動作のコード、ヒント、エラーレポート、正規表現テスト (オーサリングツール) - Oleg Sychev。
#正規表現解析、FA正規表現マッチングエンジン、マッチャーテスト、バックアップとリストア、Unicodeサポート、テンプレート - Valeriy Streltsov。
#FAマッチャーのアサーションサポート - Elena Lepilkina。
#グラフの説明 (オーサリングツール) - Vladimir Ivanov。
#シンタックスツリー (オーサリングツール) - Grigory Terekhov。
#正規表現の説明 (オーサリングツール) - '''メンテナを探しています''' 。
#アサーションのサポート - Elena Lepilkina。
テスターと寄稿者を喜んで受け入れます ([[#Developmentplans | developmentplans]] セクションを参照) - まだ時間よりも多くの作業が必要です。
おかげで:
*Joseph Rezeauは、Preg問題タイプのリリースの熱心なテスターであり、Preg問題タイプで実装された多くのアイデアの原作者でした。
* Tim Hunt  -この問題を書くのに役立った彼の丁寧で有用な回答と解説、および多くの問題タイプの開発者に役立つextra_question_fieldsコードとextra_answer_fieldsコードの共同作業。
* Bondarenko Vitaly - 正規表現マッチングテストの膨大なセットの変換用。
* Dmitriy Pahomov - 正規表現の説明の最初の作成者 (オーサリングツール)
あなたも、Pregの使い方や能力に関わらず、[[#恩返しの方法|助けになる]]たくさんのことをすることができます。
 
==恩返しの方法==
このプロジェクトは自由ソフトウェアであるため、フィードバックを得るのは困難です。これらのニーズ、励まし、または作者への難しいサポートについて誰かに話さずに、ニーズに最適なソフトウェアを入手することを期待するべきではありません。場合によっては、どこで作業し、どのように使用するか(または何が使用できないか)を書くだけで、Preg問題タイプが大いに役立つことがあります。
 
このソフトウェアは科学プロジェクトと見なされており、そのようなものは本当に有用であり、高く評価される可能性があります。
*私たちの作業の結果 (つまり、Preg問題タイプ) が人々にとって本当に有用であり、本番環境で使用されたという証拠。
*さまざまなアプリケーションでの有効性を調査するための共同作業 - 基本的には、Pregの使用方法について記述し、教師や学生と一緒に調査を行う必要があります - ただし、会議の論文やジャーナル記事の共同執筆を含めることもできます;
*記事の執筆に協力するか、英語のジャーナルへの掲載を支援します (今後の作業のための助成金に関する情報や支援も歓迎します)。
 
あなたが助ける方法を考えているなら、それについて私に書いて、詳細について質問することを躊躇しないでください。そのような作業中にも個別の支援を受けることがあります (たとえば、共同研究を行うことで、正規表現を改善するためのヒントを提供する場合があります)。
 
私は高校の教師、研究者、プログラマーであり、主な有給の仕事に多くのことをしなければならず、このタイプの問題の開発に費やす自由な時間があまりありません。あなたが何らかの方法で私を助けることができれば、私はこれを行うためにより多くの時間と労力を費やすことができるかもしれません。いくつかの例:
*参考にできるPreg問題の使用法を説明する論文や論文を公開すると、そこでのプロジェクトの評価と研究者/開発者としての私の評価が向上します。このソフトウェアに感謝している場合は、公開して参考資料をお知らせください。;
* もし、あなたがもう少し仕事をして、私を共著者として論文 (少なくとも論文) を出版することを企画してくれれば、それは '''もっと助けになる''' と思いますが、そのようなことをお考えでしたら、すぐにご連絡ください。
*出版が難しい場合は、あなたの組織やPregの使い方を書いていただければ、次に何をすべきかをより的確に判断することができます。
*テスト作業に参加してください - 問題には多くの設定があり、正規表現は非常に複雑になる可能性があるため、開発者自身がすべてのテストを行うことは困難です。
 
==開発計画==
これらの機能の開発の明確なスケジュールや順序はありません。利用可能な時間と開発者によって異なります。多くの機能では、結果を達成するために複雑なコードが必要です。特定の機能についてサポートが必要な場合は、http://moodle.orgメッセージングを使用して問題タイプのメンテナ(Oleg Sychev)に連絡してください。
*独自のテンプレートを作成できるテンプレートエディタ
*複雑なアサーションのサポート
*解答のタイプミスをキャッチするための近似マッチングのサポート
*正規表現の記述を容易にするために、一連のオーサリングツールを改善します
*次の語彙素ヒントのために言語を追加する
*正規表現についてあまり知らない人のために、より多くのヘルプと例 (進行中) を開発します。
 
==問題点?==
[https://moodle.org/mod/forum/view.php?id=752 数学フォーラム]に投稿してください。
 
==正規表現の詳細==
*[http://www.regular-expressions.info/tutorial.html 正規表現のチュートリアル]  トピックを完全に紹介しています。
*[http://www.regexplanet.com/simple/index.html 正規表現テストページ] 様々な "答え" に対して、あなたの正規表現を試してみてください。
* [http://www.nusphere.com/kb/phpmanual/reference.pcre.pattern.syntax.htm Preg構文マニュアル]
 
==他のMoodle追加プラグインもご覧ください==
* [[正規表現記述問題タイプ]] 追加プラグイン
* [[パターンマッチ問題タイプ]] 追加プラグイン
* [[作文 (自動採点) 問題タイプ]] 追加プラグイン
 
==次期リリースですぐに対応する予定の継続的な問題==
===英語の文字列の改善===
* それが言うところ:
Input your regex here. You'll see corresponding syntax tree, explaining graph and description. Click "Update" to commit changes in the regex.
** そのはず:
  Input your regex here. You'll see corresponding syntax tree, explaining graph and description. Click "Save changes" to commit changes in the regex
** "変更を保存" は、ユーザが押す必要のあるボタンの名前であるためです。
 
*それが言うところ
If the difference between engines is too hard to you,
** そのはず
If the difference between engines is too hard for you,
 
*それが言うところ
Here you can see syntax tree of you expression. Pressing the node of tree marks corresponding subtree, subgraph and corresponding part of description. You can also collapse / expand the nodes by turning on convolution.'
** そのはず
Here you can see the syntax tree of you expression. Pressing the node of tree marks the corresponding subtree, subgraph and corresponding part of the description. You can also collapse / expand the nodes by turning on Collapsing mode.
 
*それが言うところ
Here you can see explaining graph. Pressing the node of the tree marks corresponding subgraph with dark green rectangle. You can also select multiple nodes at once rectangle, enabling mode selection rectangle.
** そのはず
Here you can see an explaining graph. Pressing the node of the tree marks the corresponding subgraph with a dark green rectangle. You can also select multiple nodes at once inside a rectangle, by enabling  the Rectangle selection node checkbox.
 
*それが言うところ
Here you can see description of regular expression. Pressing the node of the tree marks corresponding subgraph marks corresponding part of description with yellow color.
** そのはず
Here you can see a description of your regular expression. Pressing the node of the tree highlights the corresponding subgraph and also marks the corresponding part of the description with a yellow color.
 
*それが言うところ
Here you can input some strings (one per line) to test your regex. After clicking "Check the string(s)" you'll see results on the right: matched parts are green, unmatched parts are red. Icon shows you whether given string matched entire regex (green check mark) or not (reg cross).
** そのはず
Here you can input some strings (one per line) to test your regex. After clicking "Check the string(s)", you'll see results on the right: matched parts are green, unmatched parts are red. An icon shows you whether the given string matched the entire regex (green check mark) or not (red cross).
 
*それが言うところ
lexem
** そのはず
** See [https://en.wikipedia.org/wiki/Lexeme lexeme in the wikipedia].
 
*(pathtodotincorrect | qtype_preg)では、次のように書かれています。
Can't draw {$a->name}: path to dot of graphviz is incorrect or dot can not be executed. Please ask your administrator to check if <a href="http://www.graphviz.com">graphviz</a> is installed and 'pathtodot' option is correct at Administration > Server > System Paths
** そのはず
Can't draw {$a->name}: path to dot of graphviz is incorrect or dot can not be executed. Please ask your administrator to check if <a href="http://www.graphviz.com">graphviz</a> is installed and 'pathtodot' option is correct at Administration > Server > System Paths (The 'path to dot' in Windows is likely C:\Program Files (x86)\Graphviz2.38\bin\dot.exe ).
 
*(pathtodotempty | qtype_preg)と書かれているところ。
Can't draw {$a->name}: path to dot of graphviz is empty. Please ask your administrator to install <a href="http://www.graphviz.com">graphviz</a> and specify path to it using the 'pathtodot' option at Administration > Server > System Paths
** そのはず
Can't draw {$a->name}: path to dot of graphviz is empty. Please ask your administrator to install <a href="http://www.graphviz.com">graphviz</a> and specify path to it using the 'pathtodot' option at Administration > Server > System Paths (The 'path to dot' in Windows is likely C:\Program Files (x86)\Graphviz2.38\bin\dot.exe ).
 
===preg.phpとは異なるファイル内の英語の文字列===
*それが言うところ
simple english
** そのはず
simple English
 
===次のバージョンで修正される予定のPHP警告===
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; qtype_preg_text_and_button has a deprecated constructor in ...\server\moodle\question\type\preg\authoring_tools\preg_text_and_button.php on line 36
 
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; MoodleQuickForm_preg_textarea has a deprecated constructor in ...\server\moodle\question\type\preg\authoring_tools\preg_textarea.php on line 37
 
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; qtype_preg_collapsible_info_block has a deprecated constructor in ...\server\moodle\question\type\preg\authoring_tools\preg_collapsible_info_block.php on line 36
 
このエラーを修正する可能性のある方法については、 [https://cweiske.de/tagebuch/php4-constructors-php7.htm Fixing PHP4 constructors for PHP7] を参照してください。
 
===Moodleコードチェッカー===
* 2016年3月16日のことです。[https://moodle.org/plugins/local_codechecker Moodleコードチェッカープラグイン]をインストールし、チェックするパスを 'question/type/preg' に設定した結果 : 170986エラー(s)と4517警告(s)が発生しました。
 
===ディスカッションへのリンク===
現在、[https://bitbucket.org/oasychev/moodle-plugins https://bitbucket.org/oasychev/moodle-plugins] を指している議論へのリンクは、ユーザフレンドリーではありません。https://moodle.org/mod/forum/view.php?id=752 にある Moodle フォーラムの regex プラグインに関する特定のスレッドを指すようにしてください。
 
===英語の文法を改善し、このドキュメントページに画像を追加しました===
* これは:
** 読みやすさの向上。
** 初めてこのプラグインを使用する人のために、エラーのリスクを軽減する。
** プログラマではないユーザのフラストレーションを軽減します。
** Moodle Docsの翻訳者の作業を容易にします。
 
* 今回のDocsページで現在検出されている問題は:
# このページは長すぎます。いくつかのページ(概要、正規表現の理解、...)に分けた方が見栄えが良いかもしれません。
** [https://docs.moodle.org/310/en/Preg_question_type_examples 短い答えの置き換えのための例]が作られました。問題なさそうですね :)
 
# 上記の例で 'ab+ (a)' および '(ab)+ (b)' に対して生成されたツリーは、現在、Moodle 3.1.11ローカルサーバで生成された画像と一致しません。これらの例に使用される正規表現は何ですか?
'ab+ (a)'
'(ab)+ (b)'
 
[[カテゴリ:寄稿コード]]
[[カテゴリ:小テスト]]
 
[[en:Preg question type]]
[[es:Tipo de pregunta Preg]]

2022年2月1日 (火) 04:47時点における最新版


注意: このプラグインは、現在 (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

ヒント

ヒントは、適応的および相互的動作の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 正規表現記述問題タイプとは異なり、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によって作成された正規表現記述問題タイプ(REGEXP)には missing words 機能があり、答えの中に何かが欠落している場合に機能する答えを定義することができます(そして学生に適切なフィードバックを与えることができます)。

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

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

となります。

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

説明が難しい場合は、見つからない正規表現を ^(?!)) で囲んでください。'--' 構文は試さないでください。これはJoseph Rezeauによって作成された正規表現記述問題タイプ(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の一覧とより多くの例はリファレンスセクションにあります。

評価の優先順位と順序

数量詞連結 よりも優先され、連結代替 よりも優先されます。その意味を見てみましょう。

  1. quantifiers over concatenation とは、量詞が最初に実行されることを意味し、括弧なしで使用された場合は1文字のみを繰り返します。
    • "many times*" は "manytime" の後に 0 個以上の "s" が続く場合にマッチします。
    • "(many times)*" は、"many times" に0回以上マッチします - 前述の正規表現を括弧を使って変更することで、文字列の繰り返しを定義することができます。
  2. concatenation over alternative とは、複数文字の代替案を括弧なしで定義できることを意味します(1文字の代替案の場合は、代替演算子ではなく文字クラスを使用するのが良いでしょう)。
    • "first|second|third" は、"first" または "second" または "third" にマッチします。
    • "(first |second |)part" は、"first part" や "second part"、あるいは単なる "part" にマッチします。これは、空の代替案の典型的な使用方法です(単なる "part" の前にスペースを必要としないように、代替案にスペースが入っていることに注意してください)。
  3. quantifier over alternativeとは、括弧を使って代替集合を繰り返すことを意味します。
    • "first|second*" は "first" または "secon" の後に "secondddd" のように 0個以上の "d" が続く場合にマッチします。
    • "(first|second)*" は、"first" または "second" に0回以上、任意の順序で繰り返されるものにマッチします("firstsecondfirstfirst")。量詞は選択肢全体を繰り返すのであって、その中から特定のものを選ぶわけではないことに注意してください。
    • "(1|2){2}" は "11" や "12" や "21" や "22" にマッチしますが、"11" や "22" だけにはマッチしません。
    • "1{2}|2{2}" は "11" または "22" のみにマッチします。

正規表現の内部構造は、シンタックスツリー(オーサリングツール)でよく見ることができます。最初に実行された演算子はツリーの下(水平方向では右)に配置され、最後に実行された演算子はツリーのルートになります。このセクションがよくわからない場合は、オーサリングツールで上の例のツリーと説明のグラフを比較することができます。正規表現演算子の "実行" とは、文字列の中でそれらをリンクさせることを意味することを覚えておいてください : 逐次リンク、代替リンク、リピート。

アンカーリング

アンカーリングは簡単なアサーションを使用して、マッチングプロセスに制限を設けるために使用されます。

  • 正規表現が '^ で始まる場合、マッチは学生の解答の最初から始まります。
  • 正規表現が $ で終わる場合、マッチは学生の解答の最後で終了します。
  • それ以外の場合、正規表現は学生の解答のどこにでもマッチします。

単純なアサーションは正規表現と連結され、連結は代替表現よりも優先されるため、使い方が少し難しいことに注意してください。

  • "^start|end$" は、文字列の先頭の "start" または末尾の "end" にマッチします。
  • "^(start|end)$" 括弧を使って、"start" または "end" に正確にマッチします。
  • "^start$|^end$" は、完全に一致させる別の方法です(すべてのトップレベルの代替案はアンカーされます)。

完全一致 オプションを "yes" に設定すると(これがデフォルト値です)、問題はあなたに代わって各正規表現に ^ と $ を追加します(サブパターンの使用には影響しません)。しかし、一般的なエラーを検出してフィードバックを行うために、いくつかのアンカーなしの正規表現を使用し、評定のために手動でアンカー付きの表現を使用することを好むかもしれません。

標準的なMoodleの記述問題タイプのより良い代替品として正規表現を使用した例

文字や単語のヒントを表示する機能により、preg問題タイプは、形成的な小テストのための非常に強力で使いやすいツールとなっています。

正規表現リファレンス

オペランド

ここでは、文字セットを定義するオペランドの不完全なリストを紹介します。

  1. 単純な文字(特別な意味を持たない)は自分自身にマッチします。
  2. エスケープされた特殊文字 は、対応する特殊文字と一致します。エスケープとは、特殊文字の前にバックスラッシュ "\" を付けることです。例えば、正規表現 "\|" は文字列 "|" にマッチし、正規表現 "a\*b\[" は文字列 "a*b[" にマッチします。バックスラッシュも特殊文字ですので、エスケープしてください。"\\" は "\" に一致します。
    • エスケープが必要な文字の全リスト [ ] | ( ) ? * + { }
    • 注意! ある文字をエスケープするかどうか迷ったときは、文字と数字以外の文字の前に "\" を置くのが安全です。文字や数字は、エスケープされると特別な意味を持ち、エスケープされないと意味を失います。
    • エスケープが必要な文字が多すぎる場合は、Q .... \E のシーケンスを使うことができます。QからEの間は、文字通り文字として扱われます。
      • "\Q^(abc)$\E." は、"^(abc)$" の後に任意の文字が続く場合にマッチします。
      • "\Q^(abc)$." は "^(abc)$." にマッチします。"\E" がないため、"\Q" 以降の文字は、正規表現の最後までリテラルとして扱われます。
  3. ドットメタ文字 (".") は あらゆる 可能な文字にマッチします (改行を除くが、学生はどこにも入力できません)。もし単一のドットにマッチする必要があるなら、"\." とエスケープします。文字クラスの中では特別な意味を失います。
  4. 文字クラス は、その中に定義されている任意の文字にマッチします。文字クラスは角括弧で定義されます。文字クラスを定義する特定の方法は次のとおりです。
    • "[ab,!]" は、"a"、"b"、"," 、"!" のいずれかにマッチします。
    • "[a-szC-F0-9]" は、"a-z"、"C-F"、"0-9" の範囲 (2文字間のハイフンで定義) に、"z" という1文字を加えたもので、"a" から "s"、"z"、"C" から "F"、"0" から "9" までのすべての文字にマッチします。
    • "[^a-z-]" は、"^" で始まり、"a" から "z" と "-" を除くすべての文字にマッチします(2つ目のハイフンは2つの文字の間に置かれていないため、それ自体が定義されていることに注意してください)。
    • "[\-\] \\]" には "文字セット内でのエスケープ" が含まれます。"-"、 "]"、"\" と一致します。他の文字は文字セット内で特別な意味を失い、エスケープすることはできませんが、文字セットに "^" を含めたい場合は、最初にそこに置くべきではありません。
  5. エスケープシーケンス は、一般的な文字セットのためのものです(文字クラスの内側でも外側でも使用できます)。

単語を表す文字 (アルファベット、アンダースコア、数字) は "\w"、単語以外の文字は"\W "となります。

    • スペース (空白) を表す "\s" と、スペース以外の文字を表す "\S"。
    • "\d" は数字を表し、"\D" は非数字を表します。
  1. Unicodeプロパティ は、文字クラスの内部または外部の両方で使用できる特定のUnicode文字を照合するための特別なエスケープシーケンス "\p{xx}" (正) または "\P{xx}" (負) です ("xx" バリエーションの完全なリストは、http://www.nusphere.com/kb/phpmanual/reference.pcre.pattern.syntax.htmにあります)。
    • "\p{Ll}" は任意の小文字に一致します。
    • "\P{Lu}" は、大文字以外の文字と一致します。
  2. POSIX character classes は、unicodeのプロパティと同じ目的で使用されますが、非ASCII文字では動作しない場合があります(完全なリストもインターネット上にあります)。これらは文字クラスの内部でのみ使用できます。
    • "[[:alnum:]]"は、任意の英数字にマッチします。
    • "[[:^digit:]]"は、数字以外の任意の文字にマッチします。
  3. 単純なアサーション とは、文字ではなくテストするための条件であり、他のオペランド (文字クラスの外でのみ意味を持つ) とは異なり、マッチングの際に文字を 消費 しません。
    • "^" は文字列の先頭にマッチし、それ以外は失敗します。
    • "$" は文字列の最後にマッチし、それ以外は失敗します。
    • "\b "は、単語の境界、つまり、単語 (\w) と非単語 (\W) の間、または、文字列が単語で始まる (終わる) 場合は、文字列の開始 (終了) 部分にマッチします。
    • "\B" は単語の境界線上にないため、"\b" に否定的です。

しかし、1文字にしかマッチしないパターンはあまり便利ではありません。そこで、複数の文字にマッチする式を定義するための 演算子 が登場します。

演算子

ここでは、一般的な正規表現の演算子をご紹介します。 Concatenation - 特別な文字の定義を必要としない、とてもシンプルな 二項演算子 です。演算子であることに変わりはなく、優先順位があります。これは、どこでブラケットを使用するかを理解する上で重要です。連結演算では、複数の演算子を連続して記述することができます。

    • "ab" は "ab" と一致します。
    • "a[0-9]" は、"a" の後に任意の数字が続く場合にマッチします。
  1. 'Alternative - 選択肢のセットを定義できる 二項演算子 です。
    • "a|b" は "a" または "b" にマッチします。
    • "ab|cd|de" は、"ab" または "cd" または "de" にマッチします。
    • "ab|cd|" は、"ab" や "cd"、または emptiness にマッチします(より複雑な表現のパーツとして便利です)。
    • "(aa|bb)c" は "aac" または "bbc" と一致します - 括弧を使って代替セットの概要を示しています。
    • "(aa|bb|)c "は、"aac" や "bbc"、"c" などの典型的な空虚さの使い方にマッチします。
  2. Quantifiers - オペランドとして使われる何かの繰り返しを定義できる 単項 演算子です。
    • "x*" は "x" に0回以上一致します。
    • "x+"は "x "に1回以上合致します。
    • "x?" は "x" に0回または1回マッチします。
    • "x{2,4}" は "x" に2回から4回までマッチします。
    • "x{2,}" は "x" に2回以上一致します。
    • "x{,2}" は0回から2回まで "x" に一致します。
    • "x{2}" は "x" に2回だけマッチします。
    • "(ab)*"は "ab" に0回以上マッチします。つまり、複数の文字に量詞を使用したい場合は、括弧を使用する必要があります。
    • "(a|b){2}" は、"aa" または "ab" または "ba" または "bb" にマッチします。つまり、"a" または "b" の繰り返しではなく、繰り返される代替案です。

サブパターンと後方参照

サブパターン とは、正規表現で取り込まれた部分文字列を 記憶 する 演算子です。サブパターンを定義する最も簡単な方法は、括弧を使うことです : 正規表現 "a(bc)d" はサブパターン "bc" を含んでいます。サブパターンは、正規表現全体の0から数えて、開いた括弧でカウントされます。この "(bc)" というサブパターンは1番目です。例えば "a(b(c)(d))e" と書いた場合、1番目のサブパターン "bcd"、2番目のサブパターン "c"、3番目のサブパターン "d" があります。 サブパターンは通常、番号を持つ 後方参照 と一緒に使われます。後方参照とは、同じ番号のサブパターンがマッチするのと同じ文字列にマッチする オペランド のことです。後方参照の最も簡単な構文は、スラッシュの後に数字を続けることです。"\1" は、第1サブパターンへの後方参照を意味します。正規表現 "([ab])\1" は、文字列 "aa" と "bb" にはマッチしますが、"ab" と "ba" にはマッチしません。なぜなら、後方参照はサブパターンがマッチしたのと同じ文字にマッチしなければならないからです。 C言語での整数変数の宣言・初期化を例に説明します。

  • "int ([_\w][_\w\d]*); \1 = -?\d+;" は、例えば、"int _var; _var = -10; "のようにマッチします。もちろん、"int" と変数名などの間にはいくらでもスペースを入れることができますので、より正しい正規表現は以下のようになります。
  • "\s*int\s+([_\w][_\w\d]*)\s*;\s*\1\s*=\s*-?\d+\s*;\s*" とすると、例えば "int var2 ; var2=123 ; " にマッチします。ちょっと怖そうですが、後から理解しようとするよりも、一度この正規表現を書いてしまった方が楽です。

最後に、サブパターンと後方参照は、単なる数字ではなく、もう少し複雑な構文で名前を持つことができます。

  1. "(?<name1>...)" は、名前が "name1" のサブパターンを意味します。
  2. "(?'name2'...)" は名前が "name2" のサブパターンを意味する。
  3. "(?P<name3>...)" は名前が "name3" のサブパターンを意味する。
  4. "\k<name4>" は、"name4" というサブパターンへの後方参照を意味する。
  5. "\k'name5" は "name5" というサブパターンへの後方参照を意味する。
  6. "\g{name6}" は "name6" というサブパターンへの後方参照を意味する。
  7. "\k{name7}" は "name7" というサブパターンへの後方参照を意味する。
  8. "(?P=name8)" は、"name8" というサブパターンへの後方参照を意味する。

これは、複雑な正規表現を扱い、サブパターンを追加したり削除したりして修正することが多い場合に非常に便利ですが、名前は変わりません。

サブパターンの番号と名前の重複

サブパターンとオルタネーションを組み合わせる際に便利な構文があります。もし "(?|...)" というグループを作ると、そのグループ内のすべての代替パターンは同じサブパターン番号を持つことになります。正規表現 "(?|(a(b))|(c(d))" を考えてみましょう。) - 2つの選択肢があり、それぞれに2つのサブパターンがあります。サブパターン "ab" と "cd" が1番目のもので、"b" と "d" が2番目のものです。

サブパターンの呼び出し

サブパターンを使用するもうひとつの方法は、サブパターンを呼び出すことです。サブパターンの呼び出しにヒットすると、マッチングエンジンは対象となるサブパターンの先頭に行き、その最後 (正規表現全体の最後ではない) まで繰り返しマッチングを開始します。サブパターンコールが参照するサブパターンの外側に配置されている場合、サブパターンの番号を除いて、そのサブパターンをコピーペーストしたのとほぼ同じことになります (番号は変わりません)。

サブパターンコールの最も一般的な使い方は、括弧の中の文字列を照合する問題で、無制限の括弧の入れ子が可能です。再帰的なサブパターンコールがなければ、任意の入れ子の深さを扱うことはできません。任意の入れ子のための正規表現は非常に複雑であり、積極的に使用すると非常に不明瞭な正規表現になってしまう可能性があることに注意してください。Preg問題イプでは、括弧を使った正規表現をより読みやすく、書きやすくするために、いくつかのテンプレートを提供しています。

サブパターンの呼び出しの構文は:

  • (?R) パターン全体の再帰呼び出し
  • (?n) サブパターンを絶対番号で呼び出す
  • (?+n) 相対番号でサブパターンを呼び出す
  • (?-n) 相対番号によるサブパターンの呼び出し
  • (?&name) 名前でサブパターンを呼び出す
  • (?P>name) 名前でサブパターンを呼び出す
  • \g<name> 名前でサブパターンを呼び出す
  • \g'name' 名前でサブパターンを呼び出す
  • \g<n> 絶対数によるサブパターンの呼び出し
  • \g'n' 絶対数によるサブパターンの呼び出し

最初のものは明示的に再帰的です。残りのバリアントは、それらが参照するサブパターンの中に置かれた場合、再帰を引き起こします。"a(b(?1)?c)d" は再帰を含み、"a(bc)(?1)d" は含みません。

有限状態オートマトン・エンジンを使用している場合、サブパターンの呼び出しはPCREとは若干異なる動作をしますが、呼び出されたサブパターンはアトミック・グループとして扱われません。一般的に、Preg問題タイプに実装されている動作は、より直感的で便利です。詳しくは、PCREのドキュメントをご覧ください。

条件付きサブパターン

条件付きサブパターンを使うと、"if-then-else" のような構造を書くことができます。基本的に、条件付きサブパターンは、条件、正の分岐、任意の負の分岐から構成されます。負の分岐が明示されていない場合は、(?:)のように空であるとみなされます。 一般的な構文は以下の通りです。"(?(condition)yes-pattern)" または "(?(condition)yes-pattern|no-pattern)" となります。

より具体的な選択肢としては:

  • (?(n)...絶対的な参照条件 - n'th サブパターンが捕捉されているか?
  • (?(+n)...相対的参照条件
  • (?(-n)...相対的参照条件
  • (?(<name>)...名前付き参照条件 - 与えられた名前のサブパターンがキャプチャされているか?
  • (?('name')...名前付き参照条件
  • (?(name))...名前付き参照条件
  • (?(R)... 全体的な再帰条件 - 'R' という名前のサブパターンが存在しない場合、パターン全体またはサブパターンへの再帰呼び出しが行われた場合に条件が真となります。
  • (?(Rn)...特定のグループの再帰条件 - 最新の再帰がn番目のサブパターンであれば条件は真となります。
  • (?(R&name)...特定の再帰条件 - 直近の再帰が、与えられた名前のサブパターンに入っていれば、条件は真となります。
  • (?(DEFINE)...参照用サブパターンの定義
  • (?(assert)...複雑なアサーション条件 - アサーション (正/負の先読み/後読み) が一致した場合に条件が真となる。

"トップレベル" では、これらの再帰テスト条件はすべて偽です。

後者の条件付きサブパターンは、まだFAエンジンではサポートされていません。

複雑なアサーション

文字列の一部に関するアサーションは、実際にはマッチングテキストには入らず、マッチングの発生に影響を与えます:

  • positive lookahead assertion "a+(?=b) "は、"b" を含むことなく、"b" で終わる "a" の任意の数にマッチします。
  • negative lookahead assertion "a+(?!b)" は、"b" が続かない "a" の任意の数にマッチします。
  • positive lookbehind assertion は、"a" の前に "b" を付けた任意の数にマッチします。
  • negative lookbehind assertion "(?<!b)a+"は、"b" が先行していない "a" の任意の数にマッチします。

ローカルな大文字小文字の区別の修飾子

Preg 2.1以降では、Perlと互換性のある正規表現の標準的な構文を使用して、正規表現の一部に大文字小文字の区別を設定することができます。

  • "(?i)" は、大文字小文字の区別をオフにします。
  • "(?-i)" は、大文字小文字の区別をオンにします。

これは、問題レベルで選択される一般的な大文字小文字の区別に影響します。そのため、いくつかの回答では大文字と小文字を区別し、いくつかの回答では大文字と小文字を区別しないようにすることができますし、回答の一部に対してもこのようにすることができます。例えば、問題を "ユースケース" に設定し、"(?i)" で始まる50%の解答を用意して、ケースが一致しないが他はすべて正しい場合には評価を下げることができます。

ローカル修飾語は、括弧内に配置された場合、最も近い ")" まで動作します。トップレベル (括弧の中ではない) に置かれた場合は、式の最後まで動作します:

  • "abc(de(?i)'gh)xyz" は、太字部分の大文字・小文字を区別しません。
  • "abc(de)(?i)'ghxyz"は、太字部分の大文字・小文字を区別しません。

エラーレポート

ネイティブのPHP preg拡張関数は、正規表現にエラーがあるかどうかを報告するだけなので、PHP preg拡張 エンジンでは、エラーについてあまり知ることができません。

FA エンジンは、カスタムの 正規表現パーサ を使用しているため、高度なエラー報告をサポートしています。潜在的なエラーにはいくつかの種類があります:

  • 条件付きサブパターン "(?(?=f)first|second|third)" の中に2つ以上のトップレベルの選択肢がある場合。
  • 開かれていない閉じ括弧 "abc)"。
  • あらゆる種類の閉じられていない開始括弧 (サブパターン、アサーションなど)) "(?:qwerty"。
  • オペランドを持たない量詞、つまり、"+" や "a(+)" を繰り返すことのない (副) 式の最初にあるもの。
  • 文字クラスの閉じていない括弧 "[a-fA-F\d"。
  • 同一の修飾語を同時に設定また解除する場合 "(?i-i)";
  • 未知の unicode プロパティ "\p{Squirrel}"。
  • 未知の posix クラス "[[:hamster:]]"。
  • 不明な (*...) シーケンス "(*QWERTY)"。
  • 不正な文字セットの範囲 "[z-a]";
  • 不正な量詞の範囲 "{5,3}";
  • \パターンの最後にある "ab\"。
  • \パターンの最後にある "ab\c"。
  • 無効なエスケープシーケンス。
  • 文字セット "[:digit:]" の外側にあるPOSIXクラス。
  • 未定義のサブパターン (abc)\2 への参照。
  • 不明、間違っている、またはサポートされていない修飾子 "(?z)"。
  • missing ) コメント後の "(?#comment";
  • 条件付きのサブパターン名の末尾がない。
  • missing ) の後に (?C;
  • サブパターン名の末尾がない。
  • 後方参照名の末尾がない。
  • 欠落している後方参照名の先頭。
  • 制御シーケンスの後に ) がない。
  • 誤った条件のサブパターン番号、数字が期待されます。
  • アサーションまたは条件として "(?()a|b)" が期待されます。
  • 文字コードが大きすぎる "\x{ffffffff}"。
  • 文字コードは許可されていません "\x{d800}"。
  • 無効な条件 (?(0)。
  • (?C...) の数字が大きすぎるため、"(?C256)" となります。
  • 2つの名前のついたサブパターンが同じ名前 "(?<name>a)(?<name>b)" である場合。
  • "abc_g{0}" という表現全体への後方参照。
  • 同じ番号のサブパターンに対して、異なるサブパターン名 "(?|(?<name1>a)|(?<name2>b))"。
  • サブパターン名として "(?<>abc)" が予想されました。
  • \c の後には、ASCII文字 "\cй" を続ける必要があります。
  • \L、\l、\N{name}、\U、および \u はサポートされていません。
  • (?< の後の認識されない文字。

著者

  1. アイデア、デザイン、問題の種類と動作のコード、ヒント、エラーレポート、正規表現テスト (オーサリングツール) - Oleg Sychev。
  2. 正規表現解析、FA正規表現マッチングエンジン、マッチャーテスト、バックアップとリストア、Unicodeサポート、テンプレート - Valeriy Streltsov。
  3. FAマッチャーのアサーションサポート - Elena Lepilkina。
  4. グラフの説明 (オーサリングツール) - Vladimir Ivanov。
  5. シンタックスツリー (オーサリングツール) - Grigory Terekhov。
  6. 正規表現の説明 (オーサリングツール) - メンテナを探しています
  7. アサーションのサポート - Elena Lepilkina。

テスターと寄稿者を喜んで受け入れます ( developmentplans セクションを参照) - まだ時間よりも多くの作業が必要です。 おかげで:

  • Joseph Rezeauは、Preg問題タイプのリリースの熱心なテスターであり、Preg問題タイプで実装された多くのアイデアの原作者でした。
  • Tim Hunt -この問題を書くのに役立った彼の丁寧で有用な回答と解説、および多くの問題タイプの開発者に役立つextra_question_fieldsコードとextra_answer_fieldsコードの共同作業。
  • Bondarenko Vitaly - 正規表現マッチングテストの膨大なセットの変換用。
  • Dmitriy Pahomov - 正規表現の説明の最初の作成者 (オーサリングツール)

あなたも、Pregの使い方や能力に関わらず、助けになるたくさんのことをすることができます。

恩返しの方法

このプロジェクトは自由ソフトウェアであるため、フィードバックを得るのは困難です。これらのニーズ、励まし、または作者への難しいサポートについて誰かに話さずに、ニーズに最適なソフトウェアを入手することを期待するべきではありません。場合によっては、どこで作業し、どのように使用するか(または何が使用できないか)を書くだけで、Preg問題タイプが大いに役立つことがあります。

このソフトウェアは科学プロジェクトと見なされており、そのようなものは本当に有用であり、高く評価される可能性があります。

  • 私たちの作業の結果 (つまり、Preg問題タイプ) が人々にとって本当に有用であり、本番環境で使用されたという証拠。
  • さまざまなアプリケーションでの有効性を調査するための共同作業 - 基本的には、Pregの使用方法について記述し、教師や学生と一緒に調査を行う必要があります - ただし、会議の論文やジャーナル記事の共同執筆を含めることもできます;
  • 記事の執筆に協力するか、英語のジャーナルへの掲載を支援します (今後の作業のための助成金に関する情報や支援も歓迎します)。

あなたが助ける方法を考えているなら、それについて私に書いて、詳細について質問することを躊躇しないでください。そのような作業中にも個別の支援を受けることがあります (たとえば、共同研究を行うことで、正規表現を改善するためのヒントを提供する場合があります)。

私は高校の教師、研究者、プログラマーであり、主な有給の仕事に多くのことをしなければならず、このタイプの問題の開発に費やす自由な時間があまりありません。あなたが何らかの方法で私を助けることができれば、私はこれを行うためにより多くの時間と労力を費やすことができるかもしれません。いくつかの例:

  • 参考にできるPreg問題の使用法を説明する論文や論文を公開すると、そこでのプロジェクトの評価と研究者/開発者としての私の評価が向上します。このソフトウェアに感謝している場合は、公開して参考資料をお知らせください。;
  • もし、あなたがもう少し仕事をして、私を共著者として論文 (少なくとも論文) を出版することを企画してくれれば、それは もっと助けになる と思いますが、そのようなことをお考えでしたら、すぐにご連絡ください。
  • 出版が難しい場合は、あなたの組織やPregの使い方を書いていただければ、次に何をすべきかをより的確に判断することができます。
  • テスト作業に参加してください - 問題には多くの設定があり、正規表現は非常に複雑になる可能性があるため、開発者自身がすべてのテストを行うことは困難です。

開発計画

これらの機能の開発の明確なスケジュールや順序はありません。利用可能な時間と開発者によって異なります。多くの機能では、結果を達成するために複雑なコードが必要です。特定の機能についてサポートが必要な場合は、http://moodle.orgメッセージングを使用して問題タイプのメンテナ(Oleg Sychev)に連絡してください。

  • 独自のテンプレートを作成できるテンプレートエディタ
  • 複雑なアサーションのサポート
  • 解答のタイプミスをキャッチするための近似マッチングのサポート
  • 正規表現の記述を容易にするために、一連のオーサリングツールを改善します
  • 次の語彙素ヒントのために言語を追加する
  • 正規表現についてあまり知らない人のために、より多くのヘルプと例 (進行中) を開発します。

問題点?

数学フォーラムに投稿してください。

正規表現の詳細

他のMoodle追加プラグインもご覧ください

次期リリースですぐに対応する予定の継続的な問題

英語の文字列の改善

  • それが言うところ:
Input your regex here. You'll see corresponding syntax tree, explaining graph and description. Click "Update" to commit changes in the regex.
    • そのはず:
 Input your regex here. You'll see corresponding syntax tree, explaining graph and description. Click "Save changes" to commit changes in the regex
    • "変更を保存" は、ユーザが押す必要のあるボタンの名前であるためです。
  • それが言うところ
If the difference between engines is too hard to you,
    • そのはず
If the difference between engines is too hard for you,
  • それが言うところ
Here you can see syntax tree of you expression. Pressing the node of tree marks corresponding subtree, subgraph and corresponding part of description. You can also collapse / expand the nodes by turning on convolution.'
    • そのはず
Here you can see the syntax tree of you expression. Pressing the node of tree marks the corresponding subtree, subgraph and corresponding part of the description. You can also collapse / expand the nodes by turning on Collapsing mode.
  • それが言うところ
Here you can see explaining graph. Pressing the node of the tree marks corresponding subgraph with dark green rectangle. You can also select multiple nodes at once rectangle, enabling mode selection rectangle.
    • そのはず
Here you can see an explaining graph. Pressing the node of the tree marks the corresponding subgraph with a dark green rectangle. You can also select multiple nodes at once inside a rectangle, by enabling  the Rectangle selection node checkbox.
  • それが言うところ
Here you can see description of regular expression. Pressing the node of the tree marks corresponding subgraph marks corresponding part of description with yellow color.
    • そのはず
Here you can see a description of your regular expression. Pressing the node of the tree highlights the corresponding subgraph and also marks the corresponding part of the description with a yellow color.
  • それが言うところ
Here you can input some strings (one per line) to test your regex. After clicking "Check the string(s)" you'll see results on the right: matched parts are green, unmatched parts are red. Icon shows you whether given string matched entire regex (green check mark) or not (reg cross).
    • そのはず
Here you can input some strings (one per line) to test your regex. After clicking "Check the string(s)", you'll see results on the right: matched parts are green, unmatched parts are red. An icon shows you whether the given string matched the entire regex (green check mark) or not (red cross).
  • それが言うところ
lexem
  • (pathtodotincorrect | qtype_preg)では、次のように書かれています。
Can't draw {$a->name}: path to dot of graphviz is incorrect or dot can not be executed. Please ask your administrator to check if <a href="http://www.graphviz.com">graphviz</a> is installed and 'pathtodot' option is correct at Administration > Server > System Paths
    • そのはず
Can't draw {$a->name}: path to dot of graphviz is incorrect or dot can not be executed. Please ask your administrator to check if <a href="http://www.graphviz.com">graphviz</a> is installed and 'pathtodot' option is correct at Administration > Server > System Paths (The 'path to dot' in Windows is likely C:\Program Files (x86)\Graphviz2.38\bin\dot.exe ).
  • (pathtodotempty | qtype_preg)と書かれているところ。
Can't draw {$a->name}: path to dot of graphviz is empty. Please ask your administrator to install <a href="http://www.graphviz.com">graphviz</a> and specify path to it using the 'pathtodot' option at Administration > Server > System Paths
    • そのはず
Can't draw {$a->name}: path to dot of graphviz is empty. Please ask your administrator to install <a href="http://www.graphviz.com">graphviz</a> and specify path to it using the 'pathtodot' option at Administration > Server > System Paths (The 'path to dot' in Windows is likely C:\Program Files (x86)\Graphviz2.38\bin\dot.exe ).

preg.phpとは異なるファイル内の英語の文字列

  • それが言うところ
simple english
    • そのはず
simple English

次のバージョンで修正される予定のPHP警告

Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; qtype_preg_text_and_button has a deprecated constructor in ...\server\moodle\question\type\preg\authoring_tools\preg_text_and_button.php on line 36
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; MoodleQuickForm_preg_textarea has a deprecated constructor in ...\server\moodle\question\type\preg\authoring_tools\preg_textarea.php on line 37
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; qtype_preg_collapsible_info_block has a deprecated constructor in ...\server\moodle\question\type\preg\authoring_tools\preg_collapsible_info_block.php on line 36

このエラーを修正する可能性のある方法については、 Fixing PHP4 constructors for PHP7 を参照してください。

Moodleコードチェッカー

  • 2016年3月16日のことです。Moodleコードチェッカープラグインをインストールし、チェックするパスを 'question/type/preg' に設定した結果 : 170986エラー(s)と4517警告(s)が発生しました。

ディスカッションへのリンク

現在、https://bitbucket.org/oasychev/moodle-plugins を指している議論へのリンクは、ユーザフレンドリーではありません。https://moodle.org/mod/forum/view.php?id=752 にある Moodle フォーラムの regex プラグインに関する特定のスレッドを指すようにしてください。

英語の文法を改善し、このドキュメントページに画像を追加しました

  • これは:
    • 読みやすさの向上。
    • 初めてこのプラグインを使用する人のために、エラーのリスクを軽減する。
    • プログラマではないユーザのフラストレーションを軽減します。
    • Moodle Docsの翻訳者の作業を容易にします。
  • 今回のDocsページで現在検出されている問題は:
  1. このページは長すぎます。いくつかのページ(概要、正規表現の理解、...)に分けた方が見栄えが良いかもしれません。
  1. 上記の例で 'ab+ (a)' および '(ab)+ (b)' に対して生成されたツリーは、現在、Moodle 3.1.11ローカルサーバで生成された画像と一致しません。これらの例に使用される正規表現は何ですか?
'ab+ (a)' 
'(ab)+ (b)'