大家好我想用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
}
答案 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()