用一个替换多个空格;当不包含在引号中时
Replaces multiple spaces with one; when not enclosed in quotes
我正在尝试解析和清理一些格式不正确的日志,这些日志通常会超过 space。所以基本上我想用一个 space 替换多个 space。但是,在引号内出现的某些内容与多余的 space 无关,我不想替换它们。我发现很多资源都在谈论用一个替换多个 space,但是得到否定,在引号内不这样做,这让我很伤心。有时我真的很想知道为什么 RegEx 逻辑让我的头脑如此混乱。
编辑:例子
Jrn.Size 0 , 3317 , 1549
变成
Jrn.Size 0 , 3317 , 1549
和
Jrn.Directive "GlobalToProj" , "[File Name.rvt]"
变成
Jrn.Directive "GlobalToProj" , "[File Name.rvt]"
"GlobalToProj"
后面多出来的space被替换了,"[File Name.rvt]"
里面多出来的space没有被替换。
您可以使用 this ingenious approach 来测试一个匹配项后面是偶数还是奇数个引号,以确定我们是在引用文本的内部还是外部:
PS C:\> 'Jrn.Directive "GlobalToProj" , "[File Name.rvt]"' -replace '\s+(?=([^"]*"[^"]*")*[^"]*$)',' '
Jrn.Directive "GlobalToProj" , "[File Name.rvt]"
模式本身:
\s+(?=([^"]*"[^"]*")*[^"]*$)
分解为:
\s+ # one or more spaces followed by
(?= # positive lookahead group containing
( # capture group containing
[^"]* # 0 or more non-doublequote characters
" # 1 doublequote mark
[^"]* # 0 or more non-doublequote characters
" # 1 doublequote mark
)* # group repeated 0 or more times
[^"]* # 0 or more non-doublequote characters
$ # end of string
)
我正在尝试解析和清理一些格式不正确的日志,这些日志通常会超过 space。所以基本上我想用一个 space 替换多个 space。但是,在引号内出现的某些内容与多余的 space 无关,我不想替换它们。我发现很多资源都在谈论用一个替换多个 space,但是得到否定,在引号内不这样做,这让我很伤心。有时我真的很想知道为什么 RegEx 逻辑让我的头脑如此混乱。
编辑:例子
Jrn.Size 0 , 3317 , 1549
变成
Jrn.Size 0 , 3317 , 1549
和
Jrn.Directive "GlobalToProj" , "[File Name.rvt]"
变成
Jrn.Directive "GlobalToProj" , "[File Name.rvt]"
"GlobalToProj"
后面多出来的space被替换了,"[File Name.rvt]"
里面多出来的space没有被替换。
您可以使用 this ingenious approach 来测试一个匹配项后面是偶数还是奇数个引号,以确定我们是在引用文本的内部还是外部:
PS C:\> 'Jrn.Directive "GlobalToProj" , "[File Name.rvt]"' -replace '\s+(?=([^"]*"[^"]*")*[^"]*$)',' '
Jrn.Directive "GlobalToProj" , "[File Name.rvt]"
模式本身:
\s+(?=([^"]*"[^"]*")*[^"]*$)
分解为:
\s+ # one or more spaces followed by
(?= # positive lookahead group containing
( # capture group containing
[^"]* # 0 or more non-doublequote characters
" # 1 doublequote mark
[^"]* # 0 or more non-doublequote characters
" # 1 doublequote mark
)* # group repeated 0 or more times
[^"]* # 0 or more non-doublequote characters
$ # end of string
)