当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 在 PowerShell 中检查字符串是否包含数字 [4 种方法]

作者:精品下载站 日期:2024-12-14 05:27:08 浏览:15 分类:玩电脑

在 PowerShell 中检查字符串是否包含数字 [4 种方法]


[玩转系统] 在 PowerShell 中检查字符串是否包含数字 [4 种方法]

使用正则表达式

每当需要查找文本中的特定模式时,我们都会使用正则表达式。正则表达式,也称为regex,由运算符、文字字符和其他结构组成。 PowerShell 有各种 cmdlet 和运算符,允许我们使用正则表达式;其中一些如下:

  • 使用 -match 运算符
  • 使用 -split 运算符
  • 使用Select-String Cmdlet
  • 使用带有 -Regex 选项的 switch 语句

我们还可以使用 -like 运算符,但它不适用于正则表达式。我们将看到如何在我们的案例中使用它。下面让我们逐一了解一下。

使用 -match 运算符

使用-match运算符检查指定字符串是否包含数字。

使用 -match 运算符:

$string = "It is a sample string containing 0123 numbers."

if ($string -match "\d+") {
    Write-Host "The string has number(s)."
}else{
    Write-Host "The string does not has number(s)."
}

输出 :

The string has number(s).

首先,我们定义了一个名为 $string 的变量,并使用包含数值的字符串值对其进行初始化。接下来,我们使用带有 -match 运算符的 if 语句和正则表达式 (\d+) 来检查 $string 包含任何数字,如果包含则返回 True。结果,if 语句变为 True,执行了 if 块;否则,else 块将被执行。最后,我们使用 Write-Host cmdlet 显示自定义消息,让用户知道是否在 $string 中找到了数字。

这里,\d 只会匹配包含小数点的数字,而不管小数点的位置如何,这意味着 01.23.0123 0123. 全部都会被检测到。同时,+ 将匹配一个或多个数字实例。

使用类似运算符

使用-like运算符来确定字符串是否包含数字。

使用类运算符:

$string = "It is a sample string containing 0123 numbers."

if ($string -like "*[0-9]*") {
    Write-Host "The string has number(s)."
}else{
    Write-Host "The string does not has number(s)."
}

输出 :

The string has number(s).

此示例与上一个示例类似,但我们使用了 -like 运算符,该运算符不支持正则表达式。尽管如此,我们仍然可以使用此运算符来检查 $string 是否包含使用模式匹配的数字。这里,*[0-9]* 匹配包含一个或多个数字的字符串。如果找到匹配,-like 运算符也会返回 True,这会导致 if 块的执行;否则,else 部分将被执行。

使用 -split 运算符

检查字符串是否包含数字:

  • 定义一个包含数字的字符串。
  • -split 运算符与 \D+ 正则表达式结合使用来匹配一个或多个非数字字符,从而生成一个包含数字序列的数组。
  • 使用 foreach 循环迭代包含我们在上一步中收到的数字序列的数组。
  • 在每次迭代中:

    • 使用带有 -match 运算符和正则表达式 (\d+) 的 if 语句来检查它是否包含数字
  • 如果满足 if 条件,请使用 Write-Host cmdlet,并使用 break 语句退出循环。

使用 -split 运算符:

$string = "It is a sample string containing 0123 numbers."
$elements = $string -split "\D+"

foreach ($element in $elements) {
    if ($element -match "\d+") {
        Write-Host "String contains a number."
        break
    }
}

输出 :

The string has number(s).

在这里,我们使用 -split 运算符将 $string 拆分为子字符串数组。分割基于指定的分隔符,\D+;仅当找到一个或多个连续的非数字字符时才匹配。拆分操作后,我们将只剩下由数字组成的子字符串,并将其保存在 $elements 中。

接下来,我们使用 foreach 语句来循环 $elements。然后,对于每次迭代,我们使用 if 语句以及 -match 运算符和 \d+ 正则表达式来检查它是否包含该数字;这个 if 语句与我们在第一个示例代码中所做的相同。最后,如果满足if语句,我们使用Write-Host通知用户$string有数字并退出使用 break 语句进行循环。

现在,我们为什么退出循环?这是因为我们只需要查找 $string 是否有数字即可;我们并不关心我们发现该数字出现了多少次。因此,即使字符串中有多个数字,此循环也会写入 PowerShell 控制台一次,因为 break 语句将在找到第一个匹配项后终止循环。

使用Select-String Cmdlet

使用Select-String cmdlet 检查字符串是否包含数字。

使用选择字符串 Cmdlet:

$string = "It is a sample string containing 0123 numbers."
$output = Select-String -InputObject $string -Pattern "\d+"

if ($output) {
    Write-Host "The string has number(s)."
}else{
    Write-Host "The string does not has number(s)."
}

输出 :

The string has number(s).

首先,我们定义并初始化 $string 变量来保存字符串类型值。接下来,我们使用带有 -InputObject-Pattern 参数的 Select-String cmdlet 来检查输入对象是否包含给定模式。

现在,输入对象和模式是什么?让我们从 Select-String cmdlet 开始学习它们;它用于查找文件和字符串中的文本。此 cmdlet 支持正则表达式来查找字符串或文件中的特定模式。这里的模式是 \d+,它只匹配数字,包括小数点,而不管小数点的位置。输入对象是指我们使用-InputObject参数指定的输入字符串或文件。

如果找到匹配项,Select-String cmdlet 将返回 True;否则,False。我们将此布尔值与 if 一起使用;如果为 True,则运行 if 块;否则,else 块。

现在,向前迈出一步,尝试更具挑战性的解决方案。假设一个字符串数组,其中每个元素包含一个简单的数字、社会安全号码、电子邮件,或者只是一个简单的文本。我们的工作是迭代字符串数组的每个元素,并检查它是否包含简单的数字、社会安全号码、电子邮件或其中都不包含。我们还必须解决默认情况。所有这一切都可以通过以下解决方案来完成。让我们继续吧。

使用带有 -Regex 选项的 switch 语句

检查字符串是否包含数字或字符串:

  • 使用数组运算符 (@()) 创建数组。
  • 使用 foreach 循环迭代上一步中创建的数组。
  • 在每次迭代中:

    • 使用带有 -Regex 选项的 switch 语句来匹配大小写并打印消息。

使用带有 -Regex 选项的 switch 语句:

$stringArray = @("This string has 123 as id.",
             "This string has 123-45-6789 as SSN.",
             "This string has [email protected] as an email.",
             "This is just a string")

foreach ($string in $stringArray) {

    switch -Regex ($string){
        "\b\d{3}-\d{2}-\d{4}\b"
            {Write-Host "This string has social security number";Break}
        "\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b"
            {Write-Host "This string has an email address";Break}
        "\b\d+\b"
            {Write-Host "This string has id number";Break}
        default
            {Write-Host "This pattern is something else"}
    }

}

输出 :

This string has id number
This string has social security number
This string has an email address
This pattern is something else

首先,我们使用以 @() 表示的数组运算符创建一个具有字符串类型值的数组,并将其存储在 $stringArray 变量中。接下来,我们使用 foreach 循环迭代 $stringArray 并将每个 $string 传递给 switch 语句。最后,我们使用带有 -Regex 选项的 switch 语句来处理正则表达式。

对于每次迭代,switch 语句都会根据提供的正则表达式匹配大小写,并使用 Write-Host cmdlet 显示一条消息。请注意,一旦发现匹配,我们就使用 Break 语句来停止 switch 语句。如果未找到匹配项,将执行 default 情况。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯