regex 通过正则表达式拆分字符串似乎无法按预期工作

y4ekin9u  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(131)

在PowerShell中使用函数:

function WriteToLog {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [AllowEmptyCollection()]
        [AllowEmptyString()]
        [string[]]$Message
    )
    BEGIN {}
    PROCESS {
        if ($Null -ne $Message) {
            $dt = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss")
            foreach ($item in $Message) {
                if ($item.length -gt 0) {
                    $it = $item -split '(.{1,70})' | Where-Object {$_}
                    $dt + ": " + $it[0] | Write-Host
                    $dt = $dt -replace '(.)',' '
                    $i = 1
                    while ($it[$i]) {
                        $dt + "  " + $it[$i] | Write-Host
                        $i++
                    }
                }
            }
        }
    }
    END {}
}

现在用字符串调用它:

"----" | WriteToLog

给出:

2023-05-25 00:28:05: -
                     -
                     -
                     -
                     -

我以为

2023-05-25 00:28:05: -----

不按字符拆分字符串。对于长度超过70个字符的字符串,它按预期工作:

"--------------------------------------------------------------------------" | WriteToLog

给出:

2023-05-25 00:32:37: ----------------------------------------------------------------------
                     ----

知道为什么会这样吗

dba5bblo

dba5bblo1#

将正则表达式更改为'(?<=\G.{70})',以便它仅在字符数为70时进行拆分,同时使用\G的正向后查找,消除了在令牌不是空字符串(Where-Object { $_ })时进行过滤的需要。条件if ($Null -ne $Message)也是不必要的,因为你已经枚举了集合并检查了if ($item.Length -gt 0)

function WriteToLog {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [AllowEmptyCollection()]
        [AllowEmptyString()]
        [string[]] $Message
    )

    process {
        $dt = (Get-Date).ToString('yyyy-MM-dd HH:mm:ss')
        foreach ($item in $Message) {
            if ($item.Length -gt 0) {
                $it = $item -split '(?<=\G.{70})'
                $dt + ': ' + $it[0] | Write-Host
                $dt = [string]::new(' ', $dt.Length)
                for($i = 1; $i -lt $it.Length; $i++) {
                    $dt + '  ' + $it[$i] | Write-Host
                }
            }
        }
    }
}

'---------------------------------------------------------------------------' | WriteToLog
'-----' | WriteToLog
WriteToLog '', ''

相关问题