无法仅捕获两个引号中的一个

时间:2017-12-22 22:21:41

标签: regex powershell ini

因此,我正在尝试解析ini文件this blog post。它在大多数情况下都有效,但我遇到了一个我对regex无法解决的特定问题。

代码示例:

function Get-IniContent
{
    [CmdletBinding()]
    [OutputType([hashtable])]
    param
    (
        [Parameter(Position = 0, Mandatory, ValueFromPipelineByPropertyName)]
        [ValidateScript({Test-Path -Path $PSItem -PathType Leaf})]
        [Alias('FullName')]
        [string]
        $Path
    )

    process
    {
        $ini = @{}

        switch -Regex -File $Path
        {
            '^\[(?<Section>.+)\]$'
            {
                $section = $Matches['Section']
                $ini[$section] = @{}
                $commentCount = 0
            }

            '^;(?<Comment>.*)'
            {
                if (-not $section)
                {
                    $section = 'NoSection'
                    $ini[$section] = @{}
                }
                $commentCount += 1
                $ini[$section]["Comment$commentCount"] = $Matches['Comment']
            }

            '(?<Key>.+?)\s*=\s*(?<Value>.*)'
            {
                if (-not $section)
                {
                    $section = 'NoSection'
                    $ini[$section] = @{}
                }

                $ini[$section][$Matches['Key']] = $Matches['Value'] -replace
                    '^"(.*)"$', '$1' -replace
                    '\s*(.*)\s*', '$1'
            }
        }

        $ini
    }
}

问题:

在本节中:

$ini[$section][$Matches['Key']] = $Matches['Value'] -replace
     '^"(.*)"$','$1' -replace
     '\s*(.*)\s*','$1'

我遇到了ini个文件可能引用了带引号的字符串的情况:

Key="  this value="something here""

我想要一个正则表达式字符串(理想情况下在切换捕获中)以避免那些周围的双引号。

我尝试在值的两边使用可选字符"?,但它只设法跳过起始引号,而不是结束引号。

修改

示例字符串:

KeyName = "value:"ac-dii-sk""

尝试模式:

$HashPattern = '\s*(?<Key>.+)\s*=\s*"?\s*(?<Value>.*)\s*"?\s*'

结果:

$Matches['Key']   = KeyName
$Matches['Value'] = value:"ac-dii-sk""

期望的结果:

$Matches['Key']   = KeyName
$Matches['Value'] = value:"ac-dii-sk"

1 个答案:

答案 0 :(得分:2)

让我们试试Balancing Capture Groups

(?<Key>.+?)\s*=\s*(?<open>")?(?<Value>.*?)(?<close-open>")?$

Test it Online

输入:KeyName = "value:"ac-dii-sk""
捕获价值:value:"ac-dii-sk"

输入:KeyName = "value:"ac-dii-sk"(少1个结束引语)
价值:value:"ac-dii-sk

输入:KeyName = value:"ac-dii-sk""(缺少开头报价)
价值:value:"ac-dii-sk""

输入:KeyName = value:"ac-dii-sk"(没有周围的引号)
价值:value:"ac-dii-sk"

正如我在评论中提到的,我建议您只使用现有的库来解析INI文件。这是来自PSGallery的2个: