PowerShell使用正则表达式来拆分字符串

时间:2015-03-18 10:19:19

标签: regex powershell split

这是我的代码:

[regex]::split("1,2   3", '(,|\s)+')

我想要的是一个包含三个元素1, 2, 3的数组,但是,我得到的是一个包含五个元素的数组。

PS C:\Users\a> [regex]::split("1,2   3", '(,|\s)+').Length
5
PS C:\Users\a>

如何得到我想要的东西?

更新

添加实际的split结果,而不是length

PS E:\> [regex]::split("1,2   3", '(,|\s)+')
1
,
2

3
PS E:\> [regex]::split("1,2   3", '(,|\s)+').length
5
PS E:\> [regex]::split("1,2   3", '[,\s]+')
1
2
3
PS E:\> [regex]::split("1,2   3", '[,\s]+').length
3
PS E:\>

更新

谢谢@Matt的回答,它指出了正确的方向。来自help about_split的文件指出:

  

默认情况下,结果中省略了分隔符。保留所有   或者是分隔符的一部分,用括号括起你的部分   想保留。

以下是我的一些测试。

PS E:\tutorial>     "Lastname/:/FirstName/:/Address" -split "/(:)/"
Lastname
:
FirstName
:
Address
PS E:\tutorial>     "Lastname/:/FirstName/:/Address" -split "/:/"
Lastname
FirstName
Address
PS E:\tutorial>     "Lastname/:/FirstName/:/Address" -split "(/:/)"
Lastname
/:/
FirstName
/:/
Address
PS E:\tutorial>     "Lastname/:/FirstName/:/Address" -split "/:(/)"
Lastname
/
FirstName
/
Address
PS E:\tutorial>     "Lastname/:/FirstName/:/Address" -split "(/):(/)"
Lastname
/
/
FirstName
/
/
Address
PS E:\tutorial>     "Lastname/:/FirstName/:/Address" -split "(/)(:)(/)"
Lastname
/
:
/
FirstName
/
:
/
Address
PS E:\tutorial> [regex]::split("Lastname/:/FirstName/:/Address", '/(:)/')
Lastname
:
FirstName
:
Address
PS E:\tutorial> [regex]::split("Lastname/:/FirstName/:/Address", '/:/')
Lastname
FirstName
Address
PS E:\tutorial> [regex]::split("Lastname/:/FirstName/:/Address", '/:(/)')
Lastname
/
FirstName
/
Address
PS E:\tutorial> [regex]::split("Lastname/:/FirstName/:/Address", '(/):(/)')
Lastname
/
/
FirstName
/
/
Address
PS E:\tutorial> [regex]::split("Lastname/:/FirstName/:/Address", '(/)(:)(/)')
Lastname
/
:
/
FirstName
/
:
/
Address
PS E:\tutorial>

1 个答案:

答案 0 :(得分:7)

在PowerShell中使用-split函数时,如果您在括号中有部分匹配项,那么您也要求返回该匹配项。我确信同样适用于[regex]的静态方法也是如此。考虑以下两个命令(与您的命令类似)的输出,您将看到

[regex]::split("1,2   3", '(,|\s+)')

1
,
2

3

[regex]::split("1,2   3", ',|\s+')

1
2
3

在第一个示例中,您会看到逗号和空格已作为元素返回。我在解释的内容记录在About_Split

  

默认情况下,结果中省略了分隔符。保留所有   要么           分隔符的一部分,用括号括起你想要的部分           保留

在这种特殊情况下

正如评论中指出的那样,还有2个更理想的正则表达式字符串可以更好地处理这种特殊情况

(?:,|\s)+[,\s]+

前者使用非捕获组,后者是字符类。