gpt4 book ai didi

regex - PowerShell使用正则表达式来分割字符串

转载 作者:行者123 更新时间:2023-12-02 02:33:03 25 4
gpt4 key购买 nike

这是我的代码:

[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>

如何得到我想要的东西?

更新

添加实际的分割结果而不是长度

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 中,文档指出:

By default, the delimiter is omitted from the results. To preserve all or part of the delimiter, enclose in parentheses the part that you want to preserve.

以下是我的一些测试。

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>

最佳答案

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

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

1
,
2

3

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

1
2
3

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

By default, the delimiter is omitted from the results. To preserve all or part of the delimiter, enclose in parentheses the part that you want to preserve.

在这种特殊情况下

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

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

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

关于regex - PowerShell使用正则表达式来分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29119383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com