考虑这个简单的代码:
class RoomReservationDialog
{
protected override async Task StartAsync(IDialogContext context)
{
context.Call(new RoomReservationNameDialog(), MessageReceived);
}
}
class RoomReservationNameDialog
{
public override async Task StartAsync(IDialogContext context)
{
// ask question
}
protected override async Task MessageReceived(IDialogContext context, IAwaitable<IMessageActivity> item)
{
…
context.Call(new RoomReservationDateTimeDialog(), HandleResult);
}
}
这会插入字符串,逐行分隔但有不需要的空格。
在声明[String]$foo = "
12CE8F-1A7F-42C8-CA99E
14BA9A-2B2D-4A24-1498C
foo
bar"
Set-Content -Value $foo -Path "C:\Test\File.txt"
时是否有办法保留缩进(代码可读性),但删除了$foo
中不需要的空格?
答案 0 :(得分:4)
使用简单的文本示例,最简单的方法是使用尾随的正则表达式语句从文本中删除所有前导空格。
[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+"
和变体
您看到上述解决方案依赖于检查所有空格。如果你穿插了空白线条,他们就会看到结果。在这种情况下,您始终可以尝试^ +"
删除文字空格或^[
t] +&#34;`用于空格和制表符。在您选择的解决方案中,点是一致的,并根据需要定制清理方法。
还有其他选择,但随后代码开始变重。手动字符串连接或使用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"