我正在尝试解析并清理一些格式不佳的日志,这些日志通常有多余的空格。所以基本上我想用一个空格替换多个空格。但是,在引号内发生的事情是额外的空格不是无关紧要的,我不想替换它们。我已经找到了大量的资源,谈论用一个替换多个空格,但得到否定,在引号内部不这样做,让我感到悲伤。我真的很想知道为什么RegEx逻辑会让我头脑发抖。
编辑:示例
Jrn.Size 0 , 3317 , 1549
变为
Jrn.Size 0 , 3317 , 1549
和
Jrn.Directive "GlobalToProj" , "[File Name.rvt]"
变为
Jrn.Directive "GlobalToProj" , "[File Name.rvt]"
替换"GlobalToProj"
后的额外空格,但"[File Name.rvt]"
中的额外空格不是。
答案 0 :(得分:1)
您可以使用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
)