"Multiple pass" 用于修复 space 缩进的正则表达式

"Multiple pass" RegEx for fixing space indentations

搜索并发现了一些看似相似的问题,但并不完全相同。

我经常发现自己需要用制表符替换前导 4-space 缩进。我总是用 RegEx ^(\t*) {4} 来代替 \t。然后我只是做多次传递来捕捉嵌套缩进。它有效,很容易。但我想知道,是否可以编写一个 RegEx 一次性完成此操作(以处理嵌套缩进)?

编辑

抱歉缺少 input/output 示例,我很着急。这是一个例子,让 s 表示 spacet 表示 tab:

SMA
ssssRTP
ssssssssATR
ssssssssOLN
ssssOWH
ssssERE
TOGO

输出:

SMA
tRTP
ttATR
ttOLN
tOWH
tERE
TOGO

本质上,RegEx 需要允许任意深度嵌套的 4 space 块。它 不需要 允许初始输入中 space 之后的制表符。

PCRE

使用 .NET 的正则表达式引擎对此进行了测试。但是 JavaScript 的(至少是 Mozilla 的)不会工作;它依赖于lookbehind,这是不可用的。 PCRE 需要固定长度的回顾,所以不幸的是,这在那里也行不通。

(?<=^( {4}|\t)*) {4}

基本思路是匹配一行开头的四个空格 加上 上一个匹配项自然会出现的所有位置。由于替换是自动完成的,因此不会遗漏这样的位置;所有这样的比赛都立即收集起来。然后确保您使用的是 Multiline 标志并替换为单个制表符,这样就可以了。

测试数据,它只是具有模糊 Python 风格的随机伪代码:

    def a:
        return true
          # comment     with embedded        spaces etc.

(^\t*|\G) {4} 替换为 \t(^|\G)( {4}|\t) 替换为 \t。你应该使用多行模式。

这是如何工作的:

^\t* — 此匹配字符串开头后跟任意数量的制表符。
\G — 本场比赛结束于上一场比赛。
​ {4} — 这匹配四个空格。

因此此正则表达式匹配字符串开头的四个空格或此正则表达式已匹配的四个空格后面的四个空格。