在下面的测试字符串中,键和值之间可以是等号或一个或多个空格字符。如果存在等号,则可以选择在其前面和/或后面加上零个或多个空格字符。
$MyTstString = "KeyX = ValueY"
$RegExString = "^(?<Key>.+)(?<Sep>\s*=\s*)(?<Value>.*)$"
$MyTstString -match $RegExString | Foreach {$Matches}
什么正则表达式可以为我做这件事?
将 RegExString 更改为
$RegExString = "^(?<Key>.+)(?<Sep>\s*=\s*|\s+)(?<Value>.*)$"
当TestString为"KeyA = ValueB"时导致Key和Sep不正确
最佳答案
备注:\s
匹配所有形式的空格,而不仅仅是空格,包括制表符、换行符……要将匹配限制为仅空格,请使用逐字空格 (
) 代替的 \s
下面。
我建议使用 -split
操作与多重赋值相结合:
$key, $value = $MyTstString -split '\s*=\s*|\s+', 2
注意:, 2
部分(指定可选的 <Max-strings>
operand )确保最多只返回 两个 标记;否则,如果值部分恰好包含空格或 =
,它可能会自身 被拆分。 .谢谢,iRon .
如果你还想捕获分隔符字符串:
$key, $sep, $value = $MyTstString -split '(\s*=\s*|\s+)', 2
至于你尝试了什么:
作为Bender the Greatest指出,一个 -match
使用标量 LHS 操作:
- 返回
$true
或$false
指示正则表达式是否匹配。 - 如果确实匹配,则填充 automatic
$Matches
variable与它找到的 - 一个 - 匹配(它永远不会寻找更多)。
(相比之下,数组(集合)作为 LHS,-match
返回匹配元素的(可能为空)子数组,并且 < em>不填充$Matches
。)
使用您原来的方法,使用更正和简化的正则表达式:
您的正则表达式的问题(两种变体)是
(?<Key>.+)
太贪婪并且在=
之前包含空格或捕获组匹配中的最后一个空格。最简单的解决方案是制作
+
量词非贪婪:(?<Key>.+?)
;或者,将匹配的字符限制为 除空格和=
之外的所有字符:
(?<Key>[^\s=]+)
.
$RegExString = '^(?<Key>.+?)(?<Sep>\s*=\s*|\s+)(?<Value>.*)$'
'KeyX1 = ValueY1', 'KeyX2 ValueY2', 'KeyX3=ValueY3' |
ForEach-Object {
if ($_ -match $RegExString) {
[pscustomobject] @{ Key = $Matches.Key; Sep = $Matches.Sep; Value = $Matches.Value}
}
}
以上结果:
Key Sep Value
--- --- -----
KeyX1 = ValueY1
KeyX2 ValueY2
KeyX3 = ValueY3
关于用于字符串中可选等号分隔符的 Powershell 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68774488/