考虑这个简单的代码:
[String]$foo = "
12CE8F-1A7F-42C8-CA99E
14BA9A-2B2D-4A24-1498C
foo
bar"
Set-Content -Value $foo -Path "C:\Test\File.txt"
这会插入字符串,逐行分隔但不需要的空格。
有没有办法在声明$foo
时保留缩进(代码可读性),但在File.txt
中删除不需要的空格?
使用简单的文本示例,最简单的方法是使用尾随的正则表达式语句从文本中删除所有前导空格。
[String]$foo = "
12CE8F-1A7F-42C8-CA99E
14BA9A-2B2D-4A24-1498C
foo
bar" -replace "(?m)^\s+"
(?m)
:使^
和$
匹配每行的开头/结尾(不仅是字符串的开头/结尾)。这是必需的,因为这不是字符串数组而是单个多行字符串。
如果你需要保留字符串中的缩进,那么使用一些东西来删除那么多空格就行了。如果您使用制表符进行缩进,则会开始分崩离析,这样您就可以使用X个制表符,或者使用前导换行符等。
[String]$foo = "
12CE8F-1A7F-42C8-CA99E
14BA9A-2B2D-4A24-1498C
foo
bar" -replace "(?m)^\s{4}"
因为那里有第一个新线,所以并不完美。如果这是一个问题,放一个.Trim()
会很容易清理。
第一个解决方案的警告是,所有行都将删除所有前导空格。您还可以指定一个控制字符,我们将其作为该行的真正开始
[String]$foo = "
!12CE8F-1A7F-42C8-CA99E
! 14BA9A-2B2D-4A24-1498C
! foo
!bar".Trim() -replace "(?m)^\s*!"
删除每行开头的零和所有空格,直到!
。我们在这个例子中使用.Trim()
来处理那个领先的空间。
注意:关于^\s+"
和Variants
您看到上述解决方案依赖于检查所有空格。如果你穿插了空白线条,他们就会看到结果。在这种情况下,您总是可以尝试使用^ +"
来删除文字空格或^[
t] +“`用于空格和制表符。点在您选择的解决方案中是一致的,并根据您的要求定制清理方法。
还有其他选择,但随后代码开始变重。手动字符串连接或使用StringBuilder之类的东西。这些选项对于您正在进行的更长的字符串或字符串更有用。
$foo = New-Object -TypeName "System.Text.StringBuilder"
$foo.Append("12CE8F-1A7F-42C8-CA99E") | Out-Null
$foo.AppendLine("14BA9A-2B2D-4A24-1498C") | Out-Null
$foo.AppendLine("foo") | Out-Null
$foo.AppendLine("bar") | Out-Null
$foo.ToString()
和
$foo = ""
$foo += "`n12CE8F-1A7F-42C8-CA99E"
$foo += "`n14BA9A-2B2D-4A24-1498C"
$foo
和
$foo = "12CE8F-1A7F-42C8-CA99E`r`n" +
"14BA9A-2B2D-4A24-1498C`r`n" +
"bar"