这是我的代码:
[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>
答案 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]+
前者使用非捕获组,后者是字符类。