用一个替换多个空格;没有用引号括起来的时候

时间:2017-01-01 18:58:21

标签: regex powershell-v2.0

我正在尝试解析并清理一些格式不佳的日志,这些日志通常有多余的空格。所以基本上我想用一个空格替换多个空格。但是,在引号内发生的事情是额外的空格不是无关紧要的,我不想替换它们。我已经找到了大量的资源,谈论用一个替换多个空格,但得到否定,在引号内部不这样做,让我感到悲伤。我真的很想知道为什么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]"中的额外空格不是。

1 个答案:

答案 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
)