用一个替换多个空格;当不包含在引号中时

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
)