【问题标题】:Powershell Get number from stringPowershell 从字符串中获取数字
【发布时间】:2014-07-05 00:46:29
【问题描述】:

大家好,我正在尝试使用 powershell 从用户 ID 中获取号码

我们使用的格式是名字的第一个字母、姓氏的前四个字母和 studentid,因此姓名为 John Smith 且 Id# 123456 的学生将是 jsmit123456 如果用户的名字少于 4 个字母,我会遇到问题。 所以使用子字符串会给那些id的错误

我试过选择字符串、-match、trim、trimstart、trimend

这是我目前的代码

$name = Get-ADUser -SearchBase "OU=A,DC=B,DC=C,DC=edu" 
-Filter {Created -ge $checktime}     
|Select-Object SAMAccountName

foreach($object in $name){
$object
$studentid = $object.SAMAccountName.Substring(5,6)
$studentid
}

【问题讨论】:

  • 您确定 ID 在您的目录 (uid) 中不作为另一个属性存在。使用像目录这样的工具将两个数据存储在同一属性中并不是那么干净。
  • 你不是在国防工业工作吗?

标签: powershell replace


【解决方案1】:

使用正则表达式很简单:

 ('jsmit123456') -replace '\D+(\d+)','$1'

 123456

\D+ = 所有非数字,\d+ = 所有数字。

 $studentid = $object.SAMAccountName -replace '\D+(\d+)','$1'

【讨论】:

  • 只是为了好玩:-join ( "jsmit123456" )[-6..-1](如果 ID 始终是六位数)
  • 在这种情况下-replace '\D+' 就足够了。
  • 只有@Joey 的回答对我有用。 @mjolinor 答案返回 5}
  • @KolobCanyon:那是因为在您的情况下,数字在非数字之前
  • 如何在字符串中第一次出现时停止?假设我得到了jsmit123456lololol123lol22,我如何只提取123456
【解决方案2】:

您应该使用更通用的正则表达式。 例如,在值之前和之后覆盖非数字字符。例如:??XXXX12345YYYY**

你应该使用:

('??XXXX12345YYYY**') -replace '\D+(\d+)\D+','$1'

$studentid = $object.SAMAccountName -replace '\D+(\d+)\D+','$1'

12345

【讨论】:

    【解决方案3】:
    Function ExtractNumbers ([string]$InStr){
       $Out = $InStr -replace("[^\d]")
       try{return [int]$Out}
           catch{}
       try{return [uint64]$Out}
           catch{return 0}}
    

    使用:

    $a = "a18афпа4sgsafd4r6!74y40:7-375+0(95)"
    

    提取号码$a

    (ExtractNumbers $a).gettype()
    

    【讨论】:

      【解决方案4】:

      出于可读性原因(我有时会发现使用正则表达式很难)我更喜欢这个解决方案:

      'john123456smith' -replace "[^0-9]" , ''
      
      123456
      

      将所有不是数字的内容,[^0-9] 替换为空内容,''。这里不涉及 $1 语法(正则匹配的字符串)

      【讨论】:

        【解决方案5】:

        与 OP 的问题略有不同,但我来到这里寻求答案,所以...

        如果字符串中有“第二”组数字,则这些数字都不能正确提取字符串中的第一个数字。

        例如,在字符串“asld_1234_asdf3”上使用其他答案会产生类似“12343”(数字后附加额外的“3”)。

        我的真实用例有一个分隔符 - “_” - 如示例所示:

            $str = "asld_1234_asdf3";
            $str -replace '.*_([0-9]*)_.*','$1'
            # produces: 1234
        

        如果不使用分隔符,则需要这个(顺便提一下,它也适用于上述带有分隔符的情况):

            $str = "asldX1234Yasdf3";
            $str -replace '\D+([0-9]*).*','$1' 
            # produces: 1234
        

        以上两个都根据我的情况产生“1234”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-03
          • 1970-01-01
          • 1970-01-01
          • 2011-08-09
          相关资源
          最近更新 更多