1

我正在努力处理旧的“格式化”代码,其中添加了很多空格来排列 = 等等:

  if (!This.RevData.Last().Size() eq 0) then
    !DocRev   = '?'
    !Status   = '?'
    !RevCode  = '?'
  else
    !Pad      = !This.RevData.Last()[1]
    !DocRev   = !Pad[2]
    !Status   = !This.GenUtil.If((!Pad[3] eq 'UA'), '' , !Pad[3])
    !RevCode  = !This.GenUtil.If((!Pad[6] eq ''  ), '?', !Pad[6])
  endif

在这个例子中,它实际上是有道理的,但大多数情况下,代码已被修改为使空白比有用的更令人困惑的状态。

我想做的是用一个空格替换所有双(或更多)空格,但我当然想保留缩进。因此,我正在寻找一个正则表达式来识别不在行首的双(或更多)空格。我已经尝试过消极的lookbehind,但似乎无法使其工作:

(?<![\n])[\s]{2,}

任何提示,有人吗?哦,我正在使用 Ultraedit(Perl 正则表达式引擎),所以正则表达式应该是“UE 兼容的”。

编辑:UE 不会逐行评估正则表达式的行;换行符只是作为文档的长字符串中的一个字符,这使问题有点复杂。

4

3 回答 3

3

将“ ([^ \n]) +”替换为“ $1”。不需要时髦的lookbehinds。

(为了强调,标记没有清楚地显示出来,但加号前有两个空格,以避免不必要地用单个空格替换单个空格。)

于 2012-08-08T08:08:46.480 回答
2

它不是 PCRE,但如果您可以访问 Linux shell,这将满足您的需求:

sed s/"([^ ]) +"/"\1 "/g source.code > reformatted.code

它只会替换非空格字符后面的任何空格,同时保留该字符。如果您习惯于 Perl Regexs,应该很容易对其进行 perlify。

于 2012-08-08T08:09:23.233 回答
1

换个试试...

(?<=[^\r\n])([\t ])[\t ]*

和...

$1
于 2012-08-08T08:09:59.113 回答