練習 - 使用字串的 IndexOf() 和 Substring() 協助程式方法
- 25 分鐘
在此練習中,您會使用 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>標記內尋找值。在此情況下,您會將 新增
6至openingPosition作為位移,以計算子字串的長度。
避免魔術值
如 "<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中使用的關鍵詞const string openSpan = "<span>";。程序代碼會使用具有 關鍵詞的
const常數。 常數可讓您定義和初始化其值永遠無法變更的變數。 然後,每當您需要該值時,您會在程式代碼的其餘部分使用該常數。 這可確保值只會定義一次,而且編譯程式會攔截變數拼錯const。上一個程式代碼清單是撰寫您在上一節中檢查的相同程序代碼更安全的方式。 現在,如果的值
openSpan變更為<div>,則使用Length屬性的程式代碼行會繼續有效。
回顧
本單元涵蓋了許多內容。 以下是要記住的最重要事項:
-
IndexOf()可為您提供其他字串內字元或字串的第一個位置。 -
IndexOf()如果找不到相符項目,則會傳回-1。 -
Substring()使用起始位置和選擇性長度,只傳回字串的指定部分。 - 解決問題的方式通常不止一種。 您已使用兩種不同的技術來尋找指定字元或字串的所有實例。
- 請避免硬式編碼的「魔術值」。 請改為定義
const變數。 初始化之後,無法變更常數變數的值。
檢定您的知識
意見反應
此頁面對您有幫助嗎?
No
需要本主題的協助嗎?
想要嘗試使用 Ask Learn 來釐清或引導您完成本主題嗎?