【问题标题】:Check if string contains numeric value in PowerShell?检查字符串是否在PowerShell中包含数值?
【发布时间】:2018-12-12 18:16:39
【问题描述】:

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

$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 返回 false,因为它将它与所有数字类型进行比较。即使很难,它也会包含一个数字,IsNumeric 的输出将是错误的。

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

【问题讨论】:

    标签: powershell numeric


    【解决方案1】:

    使用错误

    它也接受十进制数字。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        \d* 检查 0 到无限位数字

        \d?检查 0 到 1 位数字

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

        \d+ 检查 1 到无限位数字

        ^ 是一行的开头

        $ 是一行的结尾

        所以

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

        【讨论】:

        • 为正则表达式的解释点赞! :) +1
        【解决方案4】:

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

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

        【讨论】:

        • Add-Type -AssemblyName Microsoft.VisualBasic; Add-Type -AssemblyName 'Microsoft.VisualBasic, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a';
        【解决方案5】:

        检查给定字符串是否可以变成数字的正确方法:

        [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 将包含数字作为数字类型。

        【讨论】:

          【解决方案6】:

          使用 -match '\d'

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

          【讨论】:

          • 它实际上对我尝试过的每种类型的子字符串都返回 true。即使字母和数字混合在一起
          • @MarkedOne 这里的正则表达式应该是 ^\d+$ 来表示“只有数字”而不是“包含至少一个数字”。
          • "有没有更好的方法来检查字符串是否包含数值?"我把它读成一个字符串可能包含一个数值,而不仅仅是数值:)
          猜你喜欢
          • 2017-12-11
          • 2012-05-06
          • 1970-01-01
          • 2021-11-07
          • 2013-11-20
          • 2018-07-29
          • 1970-01-01
          • 2013-08-16
          相关资源
          最近更新 更多