Ruby,正则表达式匹配制表符并替换为2个空格?

6

有人在Ruby中有一个可以匹配并将制表符替换为2个空格的正则表达式吗?


1
这听起来像是你在对代码库强制执行一些格式标准,比如用空格代替制表符。请注意,通过某些提交钩子脚本来实现这一点可能会产生负面影响。违规者的本地仓库/工作副本将期望保持最新状态,但与远程仓库的差异将显示更改。最好在提交成功后进行此类更正。 - Mike Yockey
2个回答

13

再简单不过了:

str.gsub(/\t/, '  ')

2
如果您在字符串中有任何制表符,它们也将被替换,因此并不那么明显。您感兴趣的唯一制表符是每行开头的制表符。 - marines

8
如果你想扩展制表符(这与替换制表符稍有不同),那么:
# This algorithm by Brian Candler (B.Candler@pobox.com) found on the
# org.ruby-lang.ruby-talk mailing list
# http://markmail.org/message/avdjw34ahxi447qk
# Date: 2003-5-31 13:35:09
# Subject: Re: expandtabs

def expand_tabs(s, tab_stops = 8)
  s.gsub(/([^\t\n]*)\t/) do
    $1 + " " * (tab_stops - ($1.size % tab_stops))
  end
end

p expand_tabs("\tfoo", 2)      # => "  foo"
p expand_tabs(" \tfoo", 2)     # => "  foo"
p expand_tabs("\t\tfoo", 2)    # => "    foo"

扩展制表符与仅替换制表符的区别在于,制表符可以表示不同数量的字符,这取决于它出现在哪一列中。例如,如果制表符停靠在每8列,则第一列中的制表符应该被替换为8个空格,而第二列中的制表符应该被替换为7个空格,第三列中的一个应该替换为6个空格,以此类推。

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