检查字符串是否包含 PowerShell 中的数值?

Check if string contains numeric value in PowerShell?

我想检查字符串是否包含数值。我有这个代码:

$string = "some string that contains 123456     in the middle"
$substring = $string.substring(27,9).Trim()

我有 $substring,它将包含“123456”,我在这里找到了这个 IsNumeric 函数: In PowerShell, how can I test if a variable holds a numeric value?

问题是,当我从 $string 中提取它时,它的行为类似于字符串类型和 IsNumeric returns false,因为它将它与所有数字类型进行比较。甚至它会包含一个数字 IsNumeric 的输出将是错误的。

是否有更好的方法来检查字符串是否包含数值?

使用 -match '\d'

string = "some string that contains 123456     in the middle"
$substring = $string.substring(27,9).Trim()
$substring -match '\d'

检查给定字符串是否可以转换为数字的正确方法:

[string]$InString = "123456"
[Int32]$OutNumber = $null

if ([Int32]::TryParse($InString,[ref]$OutNumber)){
    Write-Host "Valid Number"
    $OutNumber
} else {
    Write-Host "Invalid Number"
    #error code here
}

然后 $OutNumber 将包含数值类型的数字。

您可以使用正则表达式匹配来测试一下:

if($substring -match "^\d+$")
{
   # Do something
}

这应该适用于任何只包含数字的字符串(即正整数)。如果要包含负整数,请将模式更改为 ^-?\d+$

使用.NET框架的传统方式:

if( [Microsoft.VisualBasic.Information]::IsNumeric($myString) ) {
  # do something
}

在正则表达式中,\d 是对数字的检查

\d* 检查 0 到无穷大数字

\d?检查 0 到 1 个数字

\d{0,5} 检查 0 到 5 位数字

\d+ 检查 1 到无穷大数字

^ 是行首

$ 是一行的结尾

所以

^\d+$ 将检查从行首到行尾的 1 个或多个数字,并且只检查数字。任何其他符号都会从头到尾断开连接并且找不到。

使用错误

它接受十进制数。

[string]$myString = "12.3456"
try{
    [int]$res=[int]1*$myString
    Write-Host "Valid Number"
}catch{
    Write-Host "Invalid Number"
}

使用 -as type_operator 可能是最强大的 shell 方式。它将 return 数字,或者 $null 如果无法转换。为了使示例尽可能简短,我使用 int 但这也适用于 floatdouble。例如:

"0" -as [int]

如果出于某种原因你 想检查字符串是否包含数字数据,那么你可以通过 ($null -ne ("0" -as [int]))[= 针对 $null 简单地测试它23=]

但是如果可能的话,您更有可能希望使用转换后的值,只需将结果分配给变量然后检查 $null:[=23= 即可轻松完成]

$myNum = "0" -as [int]
if ($myNum -eq $null) {
    #is not numeric
} else {
    #is numeric
}

使用异常作为程序控制是一种非常糟糕的做法,并且可能会保证您会看到性能比那个更高。

我还没有测试过这个断言,但我认为您很可能还会看到与发布的正则表达式方法相比性能有所提高,而且还可以方便地使用数字。您可以使用带分组的正则表达式来实现相同的目的,但还没有人发布:

"0" -match "(?<num>\d*)"
$Matches.num

而且你仍然实际进行了转换:

$Matches.num.GetType()
([Int32]$Matches.num).GetType()