PowerShell 使用正则表达式拆分字符串
PowerShell use regular expression to split a string
这是我的代码:
[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
的文档指出:
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]+
前者使用非捕获组,后者是字符 class。
我可能会迟到,但下面的例子适合我。
"Lastname,FirstName, Address pincode" -split "[\s,]+"
Lastname
FirstName
Address
pincode
这是我的代码:
[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
的文档指出:
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]+
前者使用非捕获组,后者是字符 class。
我可能会迟到,但下面的例子适合我。
"Lastname,FirstName, Address pincode" -split "[\s,]+"
Lastname
FirstName
Address
pincode