HOWTO · PowerShell

如何在 PowerShell 中找到子字符串的位置

本教程将教您如何在 PowerShell 中查找子字符串的位置。

本页内容

在 PowerShell 脚本中,定位子字符串在字符串中的位置是各种任务的基本要求,范围从文本处理到数据操作。PowerShell 提供了多种方法和 cmdlet,以高效地查找字符串中的子字符串位置。

本文探讨并详细介绍了完成此任务的各种技术。每种方法提供了独特的功能,以满足不同的场景和需求。

从使用简单的字符串操作方法到利用正则表达式的强大功能,这些方法为在 PowerShell 脚本和命令中进行子字符串搜索提供了多样性和灵活性。

通过理解和利用这些方法,PowerShell 用户可以有效地处理字符串中的子字符串搜索,使他们能够更高效地操作、提取或处理数据。

本综合指南旨在探讨、解释和演示在 PowerShell 中查找字符串内子字符串位置的各种方法的实现。

PowerShell 中的字符串和子字符串

字符串是 PowerShell 中常用的数据类型。它是表示文本的字符序列。

您可以通过使用单引号或双引号在 PowerShell 中定义字符串。例如,"ABC" 或 'ABC'。

子字符串是字符串内部的任何特定文本。如果 ABC 是一个字符串,B 是其子字符串。

有时,可能会出现需要查找字符串的某一部分或文本文件中子字符串位置的情况。IndexOf 方法和 LastIndexOf 主要报告指定子字符串在 PowerShell 中的索引位置。

使用 IndexOf 方法在 PowerShell 中查找子字符串的位置

PowerShell 中的 IndexOf 方法用于确定指定子字符串在给定字符串中首次出现的位置(索引)。该方法提供灵活性和易用性,使用户能够在字符串中执行精确的子字符串搜索。

语法:

$position = $string.IndexOf($substring)
  • $string:表示执行搜索的原始字符串。
  • $substring:指定要在 $string 中定位的子字符串。
  • $position:存储 $substring 在 $string 中首次出现的位置(索引)。

在此方法中,您可以指定字符串、字符串对象中的起始搜索位置、要搜索的字符数以及用于搜索的规则类型。

下面的示例查找给定字符串中子字符串 to 的首次出现位置。

"Welcome to PowerShell Tutorial".IndexOf("to")

输出:

8

IndexOf 方法从零开始计数,输出为 8。

在以下代码中,9 被指定为字符串中的起始搜索位置。

"Welcome to PowerShell Tutorial".IndexOf("to", 9)

当您指定起始搜索位置时,该位置之前的字符会被忽略,因此它会在索引 9 之后查找子字符串 to 的首次出现位置。

输出:

24

IndexOf 方法还考虑了子字符串不存在于字符串中的情况,在这种情况下返回 -1。

例如,在给定字符串中搜索子字符串 py 将输出结果 -1。

"Welcome to PowerShell Tutorial".IndexOf("py")

输出:

-1

高级用法:区分大小写

PowerShell 中的 IndexOf 方法默认情况下区分大小写。然而,可以通过使用 StringComparison 参数将其修改为执行不区分大小写的搜索。

$string = "PowerShell is versatile and powerful"
$substring = "VERSATILE"

$position = $string.IndexOf($substring, [System.StringComparison]::InvariantCultureIgnoreCase)
Write-Host "Position of substring '$substring' (case-insensitive) is $position"

输出:

Position of substring 'VERSATILE' (case-insensitive) is 14

解释:

  • $string:保存原始字符串。
  • $substring:包含要查找的子字符串(大小写不同)。
  • $string.IndexOf($substring, [System.StringComparison]::InvariantCultureIgnoreCase):利用 IndexOf 方法和额外参数 [System.StringComparison]::InvariantCultureIgnoreCase 执行不区分大小写的搜索。
  • 结果位置存储在 $position 中,并通过 Write-Host 显示。

使用 LastIndexOf 方法在 PowerShell 中查找子字符串的位置

您还可以使用 LastIndexOf 方法在 PowerShell 中查找子字符串的索引。LastIndexOf 方法查找字符串中某个字符的最后出现位置。

PowerShell 中的 LastIndexOf 方法是识别指定子字符串在给定字符串中最后出现位置(索引)的有力手段。通过允许用户从字符串的末尾进行搜索,该方法提供了定位子字符串最后实例的灵活性。

语法:

$position = $string.LastIndexOf($substring)
  • $string:表示执行搜索的原始字符串。
  • $substring:指定要在 $string 中定位的子字符串。
  • $position:存储 $substring 在 $string 中最后出现的位置(索引)。

以下命令查找给定字符串中子字符串 to 的最后出现位置的索引。

"Welcome to PowerShell Tutorial".LastIndexOf("to")

如上所示,它打印出子字符串 to 的最后出现位置。

输出:

24

让我们看看另一个使用字符串变量 $hello 的示例。

$hello = "HelloHelloHello"

如果您使用 LastIndexOf 方法查找 $hello 中的子字符串 He,它返回 10,因为它是 He 出现的最后索引。

$hello.LastIndexOf("He")

输出:

10

如果子字符串在字符串中未找到,则 LastIndexOf 方法返回 -1。

例如:

$hello.LastIndexOf("Hi")

输出:

-1

高级用法:区分大小写

与 IndexOf 方法类似,LastIndexOf 也支持使用 StringComparison 参数进行不区分大小写的搜索。

$string = "PowerShell is versatile and powerful"
$substring = "POWERFUL"

$position = $string.LastIndexOf($substring, [System.StringComparison]::InvariantCultureIgnoreCase)
Write-Host "Position of the last occurrence of substring '$substring' (case-insensitive) is $position"

输出:

Position of the last occurrence of substring 'POWERFUL' (case-insensitive) is 28

解释:

  • $string:包含原始字符串。
  • $substring:保存要查找的子字符串(大小写不同)。
  • $string.LastIndexOf($substring, [System.StringComparison]::InvariantCultureIgnoreCase):利用 LastIndexOf 方法和额外参数 [System.StringComparison]::InvariantCultureIgnoreCase 执行不区分大小写的搜索。
  • 结果位置存储在 $position 中,并通过 Write-Host 显示。

使用 Select-String Cmdlet 在 PowerShell 中查找子字符串的位置

PowerShell 中的 Select-String cmdlet 旨在根据正则表达式(regex)或简单字符串执行字符串搜索。它提供强大的模式匹配能力,使用户能够在字符串中搜索特定的子字符串并提取相关信息。

语法:

$match = $string | Select-String -Pattern $substring -AllMatches
  • $string:表示执行搜索的原始字符串。
  • $substring:指定要在 $string 中定位的子字符串。
  • $match:存储搜索操作的结果,包括子字符串在字符串中的位置(索引)。

Select-String cmdlet 在字符串和文件中搜索文本。它类似于 UNIX 中的 grep。

默认情况下,它在每一行中查找第一个匹配,并显示包含该匹配的所有文本。

"HelloHelloHello" | Select-String "He"

输出:

HelloHelloHello

Select-String 的 Matches 属性查找指定字符串与输入字符串或文件之间的匹配。匹配的子字符串位置存储在 Index 属性中。

以下示例显示了如何使用 Matches.Index 属性查找字符串内部子字符串的位置。

("HelloHelloHello" | Select-String "He").Matches.Index

它只打印索引 0,因为 Select-String 在每一行文本的第一个匹配后停止。

输出:

0

您可以使用 -AllMatches 参数在每一行中搜索多个匹配项。

("HelloHelloHello" | Select-String "He" -AllMatches).Matches.Index

如上所示,它打印出指定子字符串的所有位置。

输出:

0
5
10

下面的示例查找文本文件 test.txt 中指定子字符串的所有位置。test.txt 包含字符串 "Use the Select-String Cmdlet to Find the Position of Substring in PowerShell"。

(Get-Content test.txt | Select-String "the" -AllMatches).Matches.Index

输出:

4
37

该方法是查找字符串中所有字符位置的最佳选项。

如果子字符串在字符串中未找到,Select-String 将返回无匹配项($null)。

$string = "PowerShell is versatile and powerful"
$substring = "Python"

$match = $string | Select-String -Pattern $substring -AllMatches
if (-not $match) {
    Write-Host "Substring '$substring' not found in the string."
}
else {
    $position = $match.Matches[0].Index
    Write-Host "Position of substring '$substring' is $position"
}

输出:

Substring 'Python' not found in the string.

解释:

  • $string:包含原始字符串。
  • $substring:表示要定位的子字符串。
  • $string | Select-String -Pattern $substring -AllMatches:使用 Select-String 在 $string 中查找 $substring。
  • if 条件检查匹配结果是否为 $null(-not $match),如果未找到子字符串,则显示消息。

结论

定位子字符串在字符串中的位置的能力对于 PowerShell 中众多文本处理和数据操作任务至关重要。PowerShell 提供了几种方法和 cmdlet,例如 IndexOf、LastIndexOf 和 Select-String,以高效地完成此任务。

IndexOf 和 LastIndexOf 方法提供了查找字符串中子字符串位置的直接手段。这些方法提供了进行区分大小写和不区分大小写搜索的功能,使用户能够准确定位字符串中的子字符串位置。

另一方面,Select-String cmdlet 利用正则表达式进行子字符串搜索。该 cmdlet 提供了广泛的模式匹配能力,包括查找子字符串的所有出现并提取其在字符串中的位置。

理解和利用这些方法和 cmdlet 能够使 PowerShell 用户高效地操作和处理字符串。通过适当地使用这些工具,用户可以处理各种子字符串搜索场景,提取精确信息,并简化他们的 PowerShell 脚本和命令以实现有效的数据操作。