将 Ruby 代码中的前导空格转换为制表符

4

给定以下缩进文本:

  two spaces
    four
      six
non-leading    spaces

我希望将每两个前导空格转换为制表符,从软制表符转换为硬制表符。 我要求的结果如下所示(使用'x'代替“\t”):
xtwo spaces
xxfour
xxxsix
non-leading  spaces

在Ruby中,最高效或最简洁的方法是什么?

到目前为止,我所做的似乎是有效的,但感觉不太对。

input.gsub!(/^ {2}/,"x")
res = []
input.split(/\n/).each do |line|
  while line =~ /^x+ {2}/
    line.gsub!(/^(x+) {2}/,"\\1x")
  end
  res << line
end
puts res.join("\n")

我注意到这个答案使用了sed和\G:

perl -pe '1 while s/\G {2}/\t/gc' input.txt >output.txt

但我不知道如何在Ruby中模仿这个模式。这是我目前的进展:

rep = 1
while input =~ /^x* {2}/ && rep < 10
  input.gsub!(/\G {2}/,"x")
  rep += 1
end
puts input
2个回答

4

在多行模式下使用(?:^ {2})|\G {2}有什么问题吗?

第一次匹配总是在行的开头,
然后\G将连续匹配到右侧,或者匹配失败。
下一个匹配总是行的开头..重复。

在Perl中使用$str =~ s/(?:^ {2})|\G {2}/x/mg;$str =~ s/(?:^ {2})|\G {2}/\t/mg;

Ruby http://ideone.com/oZ4Os

input.gsub!(/(?:^ {2})|\G {2}/m,"x")
编辑: 当然,锚点可以被分解并放入备选项中。http://ideone.com/1oDOJ
input.gsub!(/(?:^|\G) {2}/m,"x")

1
input.gsub!(/(?:^|\G) {2}/m,"x")非常简洁,解决了我如何使用\G的疑惑。谢谢! - DonovanChan

2
你可以只使用一个gsub来实现这个功能:
str.gsub(/^( {2})+/) { |spaces| "\t" * (spaces.length / 2) }

谢谢。非常简单和类似Ruby的! - DonovanChan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接