演習 - 文字列の IndexOf() および Substring() ヘルパー メソッドを使用する
- 25 分
この演習では、 IndexOf() メソッドを使用して、大きな文字列内の 1 つ以上の文字列の位置を見つけます。 Substring()メソッドを使用して、指定した文字位置に続く大きな文字列の一部を返します。
また、 Substring() メソッドのオーバーロードされたバージョンを使用して、文字列内の指定した位置の後に返す文字の長さを設定します。
コーディング環境を準備する
このモジュールには、デモ コードをビルドして実行するプロセスをガイドする実践的なアクティビティが含まれています。 これらのアクティビティを完了するために、開発環境として Visual Studio Code を使用することをお勧めします。 これらのアクティビティに Visual Studio Code を使用すると、世界中の専門家が使用する開発環境でのコードの記述と実行に慣れるのに役立ちます。
注
この C# シリーズの Microsoft Learn を完了している場合は、コード サンプル用のプロジェクト フォルダーが既に作成されている場合があります。 その場合は、手順の次のセクションをスキップし、前の演習で使用した Project.cs ファイル内のコードを削除できます。
Visual Studio Code を開きます。
Visual Studio Code は、Windows の [スタート] メニュー (別の OS の場合は同等のリソース) を使用して開くことができます。
Visual Studio Code の [ファイル] メニューで、[フォルダーを開く] を選択します。
[フォルダーを開く] ダイアログで、Windows の [デスクトップ] フォルダーに移動します。
コード プロジェクトを保持するフォルダーの場所が異なる場合は、代わりにそのフォルダーの場所を使用できます。 このトレーニングでは、見つけやすく覚えやすい場所を用意することが重要です。
[フォルダーを開く] ダイアログで、[フォルダーの選択] を選択します。
作成者を信頼するかどうかを確認するセキュリティ ダイアログが表示された場合は、[はい] を選択します。
Visual Studio Code の [ターミナル] メニューで、[新しいターミナル] を選択します。
[ターミナル] パネルのコマンド プロンプトに、現在のフォルダーのフォルダー パスが表示されることを確認します。 例えば次が挙げられます。
C:\Users\someuser\Desktop>ターミナルのコマンド プロンプトで、指定したフォルダーに新しいコンソール アプリケーションを作成するには、「dotnet new console -o ./CsharpProjects/TestProject」と入力し、Enter キーを押します。
この .NET CLI コマンドでは、.NET プログラム テンプレートを使用して、指定したフォルダーの場所に新しい C# コンソール アプリケーション プロジェクトを作成します。 このコマンドで [CsharpProjects] と [TestProject] のフォルダーが自動的に作成され、
.csprojファイルの名前として TestProject が使用されます。[エクスプローラー] パネルで、[CsharpProjects] フォルダーを展開します。
[TestProject] フォルダーと、Program.cs という名前の C# プログラム ファイルと、TestProject.csproj という名前の C# プロジェクト ファイルの 2 つが表示されるはずです。
[エクスプローラー] パネルの [エディター] パネルにコード ファイルを表示するには、[Program.cs] を選択します。
既存のコード行を削除します。
この C# コンソール プロジェクトを使用して、このモジュール中のコード サンプルの作成、ビルド、実行を行います。
[ターミナル] パネルを閉じます。
文字列に埋め込まれたかっこペアを検索するコードを記述する
Visual Studio Code が開いていて、[エディター] パネルに Program.cs が表示されていることを確かめます。
注
Program.cs は空になっているはずです。 そうでない場合は、すべてのコード行を選択して削除します。
Visual Studio Code エディターに次のコードを入力します。
string message = "Find what is (inside the parentheses)"; int openingPosition = message.IndexOf('('); int closingPosition = message.IndexOf(')'); Console.WriteLine(openingPosition); Console.WriteLine(closingPosition);Visual Studio Code の [ファイル] メニューで、[保存] を選択します。
コードをビルドまたは実行する前に、Program.cs ファイルを保存する必要があります。
[エクスプローラー] パネルで、TestProject フォルダーの場所にあるターミナルを開くには、TestProject を右クリックし、[統合ターミナルで開く] を選択します。
ターミナル パネルが開き、ターミナルが TestProject フォルダーの場所に対して開かれていることを示すコマンド プロンプトが含まれているはずです。
コードを実行するには、ターミナルのコマンド プロンプトで、「dotnet run」と入力し、Enter キーを押します。
注
"実行するプロジェクトが見つかりませんでした" というメッセージが表示された場合は、ターミナルのコマンド プロンプトに、予期されている TestProject フォルダーの場所が表示されていることを確かめます。 例:
C:\Users\someuser\Desktop\csharpprojects\TestProject>次の出力が表示されます。
13 36この場合、
(文字のインデックスは 13 です。 これらの値は 0 から始まるので、文字列の 14 番目の文字です。)文字のインデックスは36。これで 2 つのインデックスが作成されたので、それらを境界として使用して、それらの間の値を取得できます。
かっこの間の値を取得するコードを追加する
Visual Studio Code エディターで次のようにコードを更新してください。
string message = "Find what is (inside the parentheses)"; int openingPosition = message.IndexOf('('); int closingPosition = message.IndexOf(')'); // Console.WriteLine(openingPosition); // Console.WriteLine(closingPosition); int length = closingPosition - openingPosition; Console.WriteLine(message.Substring(openingPosition, length));コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。 次の出力が表示されます。
(inside the parenthesesSubstring()メソッドでは、取得する開始位置と文字数 (長さ) が必要です。 したがって、lengthという一時変数の長さを計算し、openingPosition値を渡してかっこ内の文字列を取得します。結果はほぼ一致していますが、出力には開き括弧が含まれています。 この演習では、かっこを含めることは望ましくありません。 出力からかっこを削除するには、かっこ自体のインデックスをスキップするようにコードを更新する必要があります。
サブ文字列の開始位置を変更する
Visual Studio Code エディターで次のようにコードを更新してください。
string message = "Find what is (inside the parentheses)"; int openingPosition = message.IndexOf('('); int closingPosition = message.IndexOf(')'); openingPosition += 1; int length = closingPosition - openingPosition; Console.WriteLine(message.Substring(openingPosition, length));コード ファイルを保存してから、Visual Studio Code を使ってコードを実行してください。 次の出力が表示されます。
inside the parentheses少し時間を取って、前のコードと
openingPosition += 1;行を確認してください。openingPositionを1増やすことで、左括弧文字をスキップします。1値を使用する理由は、それが文字の長さであるためです。<div>や---など、長い文字列の後から始まる値を検索する場合は、代わりにその文字列の長さを使用します。Visual Studio Code エディターで次のようにコードを更新してください。
string message = "What is the value <span>between the tags</span>?"; int openingPosition = message.IndexOf("<span>"); int closingPosition = message.IndexOf("</span>"); openingPosition += 6; int length = closingPosition - openingPosition; Console.WriteLine(message.Substring(openingPosition, length));少し時間を取って、前のコードと
openingPosition += 6;行を確認してください。上記のコード スニペットは、開始タグと終了タグ内で値を検索
<span>方法を示しています。この場合は、サブ文字列の長さを計算するオフセットとして
6をopeningPositionに追加します。
マジック値を避ける
前のコードリストの "<span>" のようなハードコードされた文字列は"マジック文字列"と呼ばれ、 6 のようなハードコーディングされた数値は「マジックナンバー」と呼ばれます。 これらの "マジック" 値は多くの理由で望ましくなく、可能であれば避けるようにしてください。
前のコードを確認して、コード内で文字列を複数回ハードコーディングしたが、その 1 つのインスタンスのスペルを
"<span>""<sapn>"間違えた場合に、コードがどのように中断されるかを検討します。コンパイラは、値が文字列内にあるため、コンパイル時に
"<sapn>"をキャッチしません。 スペルミスは実行時に問題を引き起こしたり、コードの複雑さによっては追跡が難しい場合があります。さらに、文字列
"<span>"を短い"<div>"に変更し、6の数を5に変更することを忘れた場合、コードは望ましくない結果を生成します。Visual Studio Code エディターで次のようにコードを更新してください。
string message = "What is the value <span>between the tags</span>?"; const string openSpan = "<span>"; const string closeSpan = "</span>"; int openingPosition = message.IndexOf(openSpan); int closingPosition = message.IndexOf(closeSpan); openingPosition += openSpan.Length; int length = closingPosition - openingPosition; Console.WriteLine(message.Substring(openingPosition, length));更新されたコードと、
constで使用されるキーワードconst string openSpan = "<span>";の使用を調べるのに少し時間がかかります。このコードでは、
constキーワードと共に定数を使用します。 定数を使用すると、値を変更できない変数を定義および初期化できます。 その後、その値が必要な場合は常に、コードの残りの部分でその定数を使用します。 これにより、値が 1 回だけ定義され、const変数のスペルミスがコンパイラによってキャッチされます。前のコード一覧は、前のセクションで調べたのと同じコードをより安全に記述する方法です。 ここで、
openSpanの値が<div>に変わると、Lengthプロパティを使用するコード行は引き続き有効になります。
まとめ
この単位は多くの材料をカバーした。 覚えておくべき最も重要な点を次に示します。
IndexOf()は、別の文字列内の文字または文字列の最初の位置を示します。IndexOf()は、一致するものが見つからない場合は-1を返します。Substring()は、開始位置と省略可能な長さを使用して、文字列の指定された部分のみを返します。- 多くの場合、複数の方法で問題を解決できます。 2 つの異なる手法を使用して、特定の文字または文字列のすべてのインスタンスを検索しました。
- ハードコーディングされた マジック値は避けてください。 代わりに、
const変数を定義します。 初期化後に定数変数の値を変更することはできません。