介绍Powershell中字符串的一些基本操作。
简介
和传统的Shell(比如Bash)一致,PowerShell中的字符串由单引号'
和双引号"
定义。这两者的区别是:
- 单引号
'
定义的字符串就是字符串本身(Literal String) - 双引号
"
定义的字符串会进行一些展开操作(Expaned String)
下面是例子:
PS C:\> $x = 'world!'
PS C:\> 'Hello, $x'
Hello, $x
PS C:\> "Hello, $x"
Hello, world!
上面的例子中,双引号的"Hello, $x"
被扩展成了Hello, world!
。
为了避免字符串展开,可以在展开操作符$
之前放置一个转义字符`
。"Hello, `$x"
的计算结果是Hello, $x
。转义字符`
还可以用来表示空行,比如"`n"
输出一个空行:
PS C:\> "`n"
PS C:\> 'Hello, $x'
Hello, $x
PS C:\> "Hello, $x"
Hello, world!
基于System.String的字符串操作
Powershell是基于DotNet的,所以它的字符串其实对应着DotNet的System.String
类型。用下面的命令可以查看System.String
的类型和方法:
PS C:\> 'Hi!'.GetType()
IsPublic IsSerial Name BaseType
...
True True String System.Object
PS C:\> 'Hi' | Get-Member
TypeName: System.String
Name MemberType Definition
...
EndsWith Method bool EndsWith(string value), bool EndsWith(string value, System.StringComparison comparisonType), bool EndsWith(string value, ...
Equals Method bool Equals(System.Object obj), bool Equals(string value), bool Equals(string value, System.StringComparison comparisonType), ...
...
所以,我们可以直接调用System.String
的方法来进行字符串处理:
PS C:\> 'Hello, world!'.LastIndexOf('H')
0
PS C:\> 'Hello, world!'.SubString(0, 5)
Hello
PS C:\> 'Hello, world!'.Split(',')
Hello
world!
PS C:\> 'Hello, world!'.Equals('Hello')
False
PS C:\> 'Hello, world!'.CompareTo('Hello')
1
PS C:\> 'Hello, world!'.Remove(5)
Hello
PowerShell内建的字符串操作
除了调用System.String
的方法意外,为了方便使用,PowerShell内建了许多字符串操作。
光字符串串联(Concatenation)操作就有几种方式:
PS C:\> 'Hello' + ', ' + 'World!'
Hello, World!
> -join('Hello', ', ', 'world!')
Hello, world!
> 'Hello', 'World!' -join ', '
Hello, World!
字符串比较:
> 'Hello' -eq 'hello'
True
> 'Hello' -ceq 'hello'
False
> 'world!' -like 'world?'
True
基于正则表达式的比较:
PS C:\> 'Hello, world!' -match '(\w+), world!'
True
PS C:\> $Matches
Name Value
---- -----
1 Hello
0 Hello, world!
使用-f
操作来格式化输出字符串:
# $msg是一个数组,有两个字符串,用逗号分隔
PS C:\> $msg = @('Hello', 'world!')
# {0}占位符被替换成第一个字符串,{1}被替换成第二个
PS C:\> "{0}, {1}" -f $msg
Hello, world!
PS C:\> $now = Get-Date
PS C:\> "The time is [{0:HH}:{0:mm}:{0:ss}]" -f $now
The time is [21:21:21]
字符串与数值的转化
PS C:\> $s = '10'
PS C:\> $n = [int]$s
PS C:\> $n.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Int32 System.ValueType
PS C:\> [string]$n
10
PS C:\> $n.ToString()
10