用于字符串中可选等号分隔符的 Powershell 正则表达式

标签 powershell regex-group

在下面的测试字符串中,键和值之间可以是等号一个或多个空格字符。如果存在等号,则可以选择在其前面和/或后面加上零个或多个空格字符。

$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/

相关文章:

python - 首先先行查找,然后在先行匹配后面查找最接近的匹配捕获组。 Python 中的正则表达式

mysql - 需要正则表达式在 Mysql 中基于搜索参数进行匹配,其中字符是阿拉伯语

powershell - Start-Process cmdlet 的 -ArgumentList 参数的最大长度是多少

powershell - Powershell sqlserver上下文中的复制项目失败

regex - Perl 开关/大小写在包含非捕获组 '?' 的文字正则表达式字符串上失败

java.util.regex.Matcher混淆组

Python Regex 立即替换组

json - 使用 PowerShell 循环确定对象和/或 JSON 值的深度

powershell - Nuget - 在子文件夹中的内容上设置 CopyToOutputDirectory

regex - PowerShell RegEx 拆分 MAC 地址