修剪超过20个字符

时间:2016-10-05 20:52:20

标签: regex powershell

我正在开发一个脚本,它将根据csv文件生成AD用户名。现在我有以下几行工作。

Select-Object @{n=’Username’;e={$_.FirstName.ToLower() + $_.LastName.ToLower() -replace "[^a-zA-Z]" }}

现在,它取名并将其组合成AD友好名称。但是我需要将其命名为短至不超过20个字符。我尝试了一些不同的方法来缩短用户名,但我没有运气。

关于如何缩短用户名的任何想法?

3 个答案:

答案 0 :(得分:3)

可能最优雅的方法是在替换中使用积极的外观:

... -replace '(?<=^.{20}).*'

只有在字符串开头(^.{20})前面有20个字符时,此表达式才匹配字符串的其余部分。

另一个选项是替换前20个字符的捕获组:

... -replace '^(.{20}).*', '$1'

这会在字符串的开头捕获最多20个字符,并将整个字符串替换为仅捕获的组($1)。

答案 1 :(得分:2)

$str[0..19] -join ''

e.g。

PS C:\> 'ab'[0..19]
ab

PS C:\> 'abcdefghijklmnopqrstuvwxyz'[0..19] -join ''
abcdefghijklmnopqrst

我会在你的行中尝试:

Select-Object @{n=’Username’;e={(($_.FirstName + $_.LastName) -replace "[^a-z]").ToLower()[0..19] -join '' }}

([a-z]因为PowerShell正则表达式匹配是非感性的,并且正在移动.ToLower()所以你只需要调用它一次。)

如果您使用的是严格模式,那么为什么不检查长度以避免超出数组的范围而令人愉快:

$str[0..[math]::Min($str.Length, 19)] -join ''

答案 2 :(得分:1)

要在PowerShell中截断字符串,可以使用.NET String::Substring方法。以下行将返回$targetLength的第一个$str字符,如果$str短于此字符,则返回整个字符串。

if ($str.Length -gt $targetLength) { $str.Substring(0, $targetLength) } else { $str }

如果您更喜欢正则表达式解决方案,以下工作(感谢@PetSerAl)

$str -replace "(?<=.{$targetLength}).*"

快速测量显示正则表达式方法比子串方法慢约70%(942ms与200,000行日志文件上的557ms相比)