Powershell从字符串中获取数字

时间:2014-05-16 14:11:08

标签: powershell replace

大家好我想用powershell

从用户ID中获取号码

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

提供错误

我尝试了select-string,-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
}

5 个答案:

答案 0 :(得分:11)

这与正则表达式很简单:

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

 123456

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

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

答案 1 :(得分:11)

出于可读性的原因(我有时会发现regexp很难)我更喜欢这个解决方案:

O(n)

替换不是数字的所有内容,[^ 0-9],什么也没有,''。这不涉及$ 1语法(正则表达式匹配的字符串)

答案 2 :(得分:1)

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

您应该使用:

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

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

12345

答案 3 :(得分:1)

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

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

例如,使用字符串“ 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”。

答案 4 :(得分:0)

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)"

ExtractNumbers $a

(ExtractNumbers $a).gettype()