Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在ruby中将前导空格转换为制表符_Ruby_Regex - Fatal编程技术网

在ruby中将前导空格转换为制表符

在ruby中将前导空格转换为制表符,ruby,regex,Ruby,Regex,给定以下缩进文本: two spaces four six non-leading spaces 我想将每2个前导空格转换为一个制表符,基本上是从软制表符转换为硬制表符。我正在查找以下结果(使用“x”而不是“\t”): 在ruby中,最有效或最有说服力的方法是什么 到目前为止,我所做的似乎是有效的,但感觉不太对劲 input.gsub!(/^ {2}/,"x") res = [] input.split(/\n/).each do |line| while l

给定以下缩进文本:

  two spaces
    four
      six
non-leading    spaces
我想将每2个前导空格转换为一个制表符,基本上是从软制表符转换为硬制表符。我正在查找以下结果(使用“x”而不是“\t”):

在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")
但我不知道如何在Ruby中模仿这种模式。就我所知:

rep = 1
while input =~ /^x* {2}/ && rep < 10
  input.gsub!(/\G {2}/,"x")
  rep += 1
end
puts input
rep=1
而input=~/^x*{2}/&&rep<10
input.gsub!(/\G{2}/,“x”)
rep+=1
结束
输入

您只需使用一个gsub即可:

str.gsub(/^( {2})+/) { |spaces| "\t" * (spaces.length / 2) }

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

第一个匹配总是在行的开头,
然后\G将在该匹配项旁边连续匹配,或匹配项
将失败。下一场比赛永远是队伍的开始。。重复

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

红宝石

编辑:当然,可以将锚定因素分解并放入备选方案中


谢谢非常简单,像红宝石<代码>输入.gsub!(/(?:^ |\G){2}/m,“x”)
非常简洁,解决了我关于如何使用的难题。谢谢!
rep = 1
while input =~ /^x* {2}/ && rep < 10
  input.gsub!(/\G {2}/,"x")
  rep += 1
end
puts input
str.gsub(/^( {2})+/) { |spaces| "\t" * (spaces.length / 2) }
input.gsub!(/(?:^ {2})|\G {2}/m,"x")
input.gsub!(/(?:^|\G) {2}/m,"x")