练习 - 使用字符串的 IndexOf() 和 Substring() 帮助程序方法
- 25 分钟
在本练习中,你将使用 IndexOf() 方法查找一个或多个字符在较大字符串中的位置。 您可以使用 Substring() 方法来返回较大字符串中位于指定字符位置之后的部分。
你还将使用 Substring() 方法的重载版本来设置在字符串中指定位置后要返回的字符长度。
准备编码环境
本模块包括指导你完成生成和运行演示代码的过程的动手活动。 建议使用 Visual Studio Code 作为开发环境来完成这些活动。 使用 Visual Studio Code 进行这些活动有助于你在全球专业人员使用的开发人员环境中轻松编写和运行代码。
注释
如果已完成此 C# 系列中的其他 Microsoft Learn 模块,则可能已经为代码示例创建了一个项目文件夹。 如果是这种情况,可以跳过步骤的以下部分,并删除用于上一练习的 Project.cs 文件中的代码。
打开 Visual Studio Code。
可以使用 Windows“开始”菜单(或其他 OS 的等效资源)打开 Visual Studio Code。
在 Visual Studio Code 的“文件”菜单上,选择“打开文件夹”。
在“打开文件夹”对话框中,导航到 Windows 桌面文件夹。
如果使用了不同的文件夹位置来保存代码项目,则可以改用该文件夹位置。 对于此培训,重要的是要有一个易于定位和记忆的位置。
在“打开文件夹”对话框中,选择“选择文件夹”。
如果看到一个询问你是否信任作者的安全对话框,请选择“是”。
在 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>")被称为“魔法字符串(magic strings)”,硬编码的数值(如6)被称为“魔法数字(magic numbers)”。 由于许多原因,这些“魔法”值是不受欢迎的,你应该尽量避免使用它们。
查看前面的代码,考虑代码可能中断的情况:如果你在代码中多次对字符串
"<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()仅使用起始位置和可选长度返回字符串的指定部分。- 解决问题的方法通常不止一种。 你使用了两种不同的技术来查找给定字符或字符串的所有实例。
- 避免硬编码的 magic 值。 而是定义变量
const。 初始化后,无法更改常量变量的值。