Powershell从字符串中获取数字

Jos*_*tiz 6 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
}
Run Code Online (Sandbox Code Playgroud)

mjo*_*nor 14

这与正则表达式很简单:

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

 123456
Run Code Online (Sandbox Code Playgroud)

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

 $studentid = $object.SAMAccountName -replace '\D+(\d+)','$1'
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,`-replace'\ D +'`应该足够了. (8认同)
  • 如何在字符串中第一次出现时停止?假设我得到了 `jsmit123456lololol123lol22`,我如何只提取 `123456`? (2认同)

小智 13

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

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

123456
Run Code Online (Sandbox Code Playgroud)

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


BRe*_*bey 5

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

如果字符串中存在“第二”组数字,则这些数字都无法正确提取字符串中的第一个数字。

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

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

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

如果分隔符不起作用,您需要这个(顺便说一下,它也适用于上面带有分隔符的情况):

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

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