練習 - 使用字串的 IndexOf() 和 Substring() 協助程式方法
在本練習中,您會使用 IndexOf()
方法在較大型字串內找出一或多個字元字串的位置。 您可以使用 Substring()
方法來傳回較大型字串的一部分,該字串遵循您指定的字元位置。
您也會使用 Substring()
方法的多載版本,來設定字串中指定位置之後要傳回的字元長度。
準備您的撰寫程式碼環境
本課程模組包含實際操作活動,可引導您完成建置及執行示範程式碼的程序。 鼓勵您使用 Visual Studio Code 做為開發環境來完成這些活動。 針對這些活動使用 Visual Studio Code,可協助您熟悉在全球專業人員使用的開發人員環境中撰寫及執行程式碼。
注意
如果您已完成此 C# 系列中的其他 Microsoft Learn 課程模組,您可能已建立程式碼範例的專案資料夾。 如果是這種情況,您可以略過下列步驟的部分,並刪除用於上一個練習的 Project.cs
檔案中的程式碼。
打開 Visual Studio Code。
您可以使用 Windows [開始] 功能表 (或另一個作業系統的對等資源) 來開啟 Visual Studio Code。
在 Visual Studio Code 的 [檔案] 功能表上,選取 [開啟資料夾]。
在 [開啟資料夾] 對話方塊中,瀏覽至 Windows Desktop 資料夾。
如果您在不同的資料夾位置中保留程式碼專案,您可以改用該資料夾位置。 針對本訓練,請務必使用容易找到並記住的位置。
在 [開啟資料夾] 對話方塊中,選取 [選取資料夾]。
如果您看到詢問您是否信任作者的安全性對話方塊,請選取 [是]。
在 Visual Studio Code 的 [終端] 功能表上,選取 [新增終端]。
請注意,終端面板中的命令提示字元會顯示目前資料夾的資料夾路徑。 例如:
C:\Users\someuser\Desktop>
在終端命令提示字元中,若要在指定的資料夾中建立新的主控台應用程式,請輸入 dotnet new console -o ./CsharpProjects/TestProject,然後按 Enter 鍵。
這個 .NET CLI 命令會使用 .NET 程式範本,在指定的資料夾位置中建立新的 C# 主控台應用程式專案。 這個命令會為您建立 CsharpProjects 和 TestProject 資料夾,並使用 TestProject 做為
.csproj
檔案的名稱。在 [總管] 面板中,展開 CsharpProjects 資料夾。
您應該會看到 TestProject 資料夾和兩個檔案:名為 Program.cs 的 C# 應用程式檔案,以及名為 TestProject.csproj 的 C# 專案檔。
在 [總管] 面板中,若要在 [編輯器] 面板中檢視程式碼檔案,請選取 [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。 請記住,這些值是從零開始,因此其為字串中的第 14 個字元。 而)
字元的索引為36
。現在您已經有兩個索引,您可以將其作為界限來擷取兩者之間的值。
新增程式碼以擷取括弧之間的值
在 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 parentheses
Substring()
方法需要起始位置以及要擷取的字元數或長度。 因此,您會在稱為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>
標記內的值。在此情況下,您會將
openingPosition
增加6
,作為計算子字串長度的位移。
避免魔術值
如先前程式碼清單中的 "<span>"
,寫在程式碼中的字串稱為「魔術字串」,而寫在程式碼中的數值 (例如 6
) 稱為「魔術數字」。 基於許多原因,這些「魔術」值效果不好,應該盡可能避免使用。
檢閱先前的程式碼,考慮如果您將字串
"<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 string openSpan = "<span>";
中使用的const
關鍵字。該程式碼會搭配
const
關鍵字使用常數。 常數可讓您定義和初始化變數,且其值永遠不會變更。 如此一來,當您需要該值時,您就可以在其餘的程式碼中使用該常數。 這可確保此值只會定義一次,且編譯器便能夠抓取到const
變數的拼寫錯誤。先前的代碼清單是撰寫您在上一節中檢查之相同程式碼的更安全方式。 現在,如果
openSpan
的值變更為<div>
,則使用Length
屬性的程式碼繼續有效。
概括回顧
本單元涵蓋許多材料。 以下為您最需要記得的重點:
IndexOf()
可為您提供其他字串內字元或字串的第一個位置。- 如果
IndexOf()
找不到相符項目,則傳回-1
。 Substring()
可藉由開始位置與選用長度,只傳回指定的部分字串。- 您通常有一種以上的方法可以解決問題。 您使用了兩種不同技術來尋找指定字元或字串的所有執行個體。
- 請避免硬式編碼的「魔術值」。 反之,請定義
const
變數。 因為在初始化之後,常數變數的值就無法再變更。