搜索并发现一些看似相似的问题,但并不完全。
我经常发现自己需要用标签替换前导的4空格缩进。我总是使用RegEx ^(\t*) {4}
执行此操作,替换为$1\t
。然后我只做多次传递以捕获嵌套缩进。它有效,很容易。但是我想知道,是否可以编写一个可以一次执行此操作的RegEx(以处理嵌套缩进)?
修改
对缺乏输入/输出示例表示歉意,我很着急。以下是一个例子,让s
表示space
,t
表示tab
:
SMA
ssssRTP
ssssssssATR
ssssssssOLN
ssssOWH
ssssERE
TOGO
输出:
SMA
tRTP
ttATR
ttOLN
tOWH
tERE
TOGO
基本上,RegEx需要允许任意深度嵌套的4个空格块。 不需要允许在初始输入中跟随空格的标签。
PCRE
答案 0 :(得分:2)
(^\t*|\G) {4}
替换为$1\t
或(^|\G)( {4}|\t)
替换为\t
。您应该使用多线模式。
^\t*
- 此字符串的匹配开头后跟任意数量的标签
\G
- 上一场比赛的比赛结束
{4}
- 这匹配四个空格。
因此,这个正则表达式在字符串开头处匹配四个空格,或者在此正则表达式已经匹配的四个空格之后匹配四个空格。
答案 1 :(得分:1)
使用.NET的正则表达式引擎进行测试。但是,JavaScript(至少是Mozilla的)不会工作;它依赖于lookbehind,这是不可用的。 PCRE想要固定长度的外观,所以不幸的是,这也不会在那里工作。
(?<=^( {4}|\t)*) {4}
基本思路是匹配前面有一行开头的四个空格加上所有前一个匹配自然会去的地方。由于替换是以原子方式完成的,因此没有机会错过这样的地点;所有这些比赛都是立即收集的。然后确保您使用Multiline
标记,并使用单个标签字符替换,您就可以了。
测试数据,它只是一种模糊的Pythonesque风格的随机伪代码:
def a:
return true
# comment with embedded spaces etc.