4.1 コースID/プランIDのチェック

目的

正規表現を用いてコースID/プランIDが命名規則に則っているかをチェックします。

必要な情報

コースID、プランID

与えられている引数

PlanSetupクラスのインスタンスplan

必要な情報へのアクセス方法

現在開いているプランからコースおよびプラン情報へアクセスするには、以下のようにします。

1
2
3
4
5
6
7
//Courseクラスのインスタンスcourseを取得
var course = plan.Course;
//コースIDの取得
var courseId = course.Id;

//プランIDの取得
var planId = plan.Id;

正規表現について

正規表現とは、検索や置換で指定する文字列をパターン表現する方法です。パターンを表現するための記号(メタ文字)を組み合わせることで、「3桁の数字」や「aから始まる英単語」といった柔軟かつ複雑な文字列検索を行うことができます。C#の正規表現では Regex クラスが一般的に使われます。正式に記述する場合、System.Text.RegularExpressions.Regex となり、コードが冗長となります。ソースコードの先頭で using ディレクティブを使用して名前空間の使用宣言を記述することにより、以降は名前空間を省略した簡易な記述が可能となります。
以下に例を示します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Regexクラスを使用するために、名前空間の使用宣言
using System.Text.RegularExpressions;

--- 省略 ---

// 検索対象となる文字列
string text ="123";
// 検索パターンとして0~9の数字3文字を指定
string pattern ="[0-9]{3}";
// 正規表現を定義
Regex regex = Regex(pattern);
// Matchメソッドで指定した正規表現に一致する箇所を検索
Match result = regex.Match(text);
// 戻り値のSuccessプロパティを使用して、一致が成功したかどうかを判定し、if文で処理を分岐
if(result.Success == true)
{
    --- 省略 ---
}
else
{
    --- 省略 ---
}

正規表現に関する詳細については以下のドキュメントをご覧ください。
・.NET の正規表現
https://docs.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expressions
・Regex クラス
https://docs.microsoft.com/ja-jp/dotnet/api/system.text.regularexpressions.regex?view=netframework-4.5

必要な情報の表示

Exercise_PlanCheck_Ex1.2.csを開き、関数 CheckPlanFunc 内にコードを記述してみましょう。

1
2
3
4
5
6
7
8
//Courseクラスのインスタンスcourseを取得
var course = plan.Course;
//コースIDの取得
var courseId = course.Id;
//プランIDの取得
var planId = plan.Id;

MessageBox.Show(string.Format("Course ID: {0}\nPlan ID: {1}", courseId, planId));

実装

コースIDチェックの実装部分

C1」や「C2」といった接頭文字「C」につづき連番数字となる命名規則を設けている場合を想定します。文字列先頭の文字を指定するには「^」を使用し、今回は「C」であるため、「^C」となります。その後に数字が1~2文字続くことを指定するには「[0-9]{1,2}$」とします。最後の「$」は指定した数字で文字列が終わることを意味します。
検索パターンは以上を組み合わせて「"^C[0-9]{1,2}$"」という記述となります。
下記に判定例を示します。

〇:C1, C10
X:C100, C1a, C10a, c1, A1,Ca1

Exercise_PlanCheck_Ex1.2.csを開き、関数 CheckPlanFunc 内の次の2行のコメントを解除します。

1
//string checkName = "";
1
//checkName = "Course ID";

関数 CheckPlanFunc 内の下記部分にコードを記述しましょう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
static string CheckPlanFunc(PlanSetup plan)
{
    //Initializes the variables
    string oText = "";
    string checkName = "";


    ////////////////////////////////////////////////////////////////////////////////
    // Check course ID 
    checkName = "Course ID";

 ~~以下にコドを記述~~

記述するコードは以下の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
//Retrieve Course class
var course = plan.Course;
var courseId = course.Id;

//Set regular expression
string expressionC = "^C[0-9]{1,2}$";
Regex regC = new Regex(expressionC);
Match resultC = regC.Match(courseId);

if (resultC.Success == true)
{
    // If true, add text[O] to the string
    oText += MakeFormatText(true, checkName, "");
}
else
{
    //If false, add the parameters and text[X] to the string
    oText += MakeFormatText(false, checkName, courseId);
}

本演習用ではプランチェックの結果をテキストとしてメッセージウィンドウに表示させます。
チェックする項目毎にテキストを整形(定型化)するのは煩雑となるため、チェック結果を定型文に整形する関数 MakeFormatText を実装しています。 関数 MakeFormatText の詳細は以下の通りで、判定結果を引数 judge として渡して条件に応じて整形して返します。

judge checkName paraText oText
true Course ID C1 Course ID: O
false Course ID C1a Course ID: (C1a) X
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
static string MakeFormatText(bool judge, string checkName, string paraText)
{
    //Initializes the variables
    string oText = "";

    if (judge == true)
    {
        // If true, add text[O] to the string 
        oText = checkName + ": O \n";
    }
    else
    {
        //If false, add the parameters and text[X] to the string 
        //oText = checkName + ": X \n";
        oText = checkName + ": (" + paraText + ") X \n";
    }
    return oText;
}

プランIDチェックの実装部分

1-1」や「2-1」といった連番数字と連番数字を「-」でつなぐ命名規則を設けている場合を想定します。先頭の文字列は1~2文字の連番数字であることを指定するには、「^[0-9]{1,2}」とします。「-」に続いて1~2文字の連番数字で終わることを指定するには「-[0-9]{1,2}$」とします。
検索パターンは以上を組み合わせると「"^[0-9]{1,2}-[0-9]{1,2}$"」という記述となります。
下記に判定例を示します。

〇:1-1, 2-1, 11-1, 99-99
X:1-1a, a1-1, 11,1--1, 1+1

Exercise_PlanCheck_Ex1.2.csを開き、関数 CheckPlanFunc 内の次の1行のコメントを解除します。

1
//checkName = "Plan ID";

関数 CheckPlanFunc 内の下記部分にコードを記述します。

1
2
3
4
5
/////////////////////////////////////////////////////////////////////////
// Check plan ID
checkName = "Plan ID";

 ~~以下にコドを記述~~

記述するコードは以下の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
//Retrieve plan Id
var planId = plan.Id

//Set regular expression
string expressionP = "^[0-9]{1,2}-[0-9]{1,2}$";
Regex regP = new Regex(expressionP);
Match resultP = regP.Match(planId);

if (resultP.Success == true)
{
    // If true, add text[O] to the string
    oText += MakeFormatText(true, checkName, "");
}
else
{
    //If false, add the parameters and text[X] to the string
    oText += MakeFormatText(false, checkName, planId);
}