在ruby中智能转换双引号到单引号

时间:2013-05-14 10:30:53

标签: ruby regex

问题

在源文件中,我有大量的字符串。有些是插值,有些是特殊符号,有些没有。

我试图弄清楚如果我可以用单引号替换简单字符串的双引号,同时为插值和特殊符号字符串留下双引号。然后我会在一个或多个源代码文件上运行此转换。

我想可能有一个很好的正则表达式,但我不能完全表达它。

示例 - 代码

想象一下以下代码:

def myfunc(var, var2 = "abc")
  s = "something"
  puts "a simple string"
  puts "string with a single ' quote"
  puts "string with a newline \n"  
  puts "my #{var}"
end

示例 - 结果

我想把它变成这个:

def myfunc(var, var2 = 'abc')
  s = 'something'
  puts 'a simple string'
  puts "string with a single ' quote"
  puts "string with a newline \n"  
  puts "my #{var}"
end

如果有人有任何想法,我将非常感激!

1 个答案:

答案 0 :(得分:1)

假设您可以自己将文件中的字符串读入数组strings

strings = [ "\"a simple string\"",
            "\"string with a single ' quote\"",
            "\"string with a newline \n\""
            "\"my \#{var}\"" ]

然后我们会eval他们看看他们的行为:

$SAFE = 4
single_quoted_when_possible = strings.map { |double_quoted|
  begin
    string = eval( double_quoted ) # this string, as Ruby sees it
    raise unless string.is_a? String
    raise unless '"' + string + '"' == double_quoted
  rescue
    raise "Array element is not a string!"
  end
  begin  
    raise unless eval( "'#{string}'" ) == string
    "'#{string}'"
  rescue
    double_quoted
  end
}

而SAFE 4级只是woodoo,只是我承认我们正在做一些危险的事情。我不知道它在多大程度上可以防止所有危险。

在您的特定情况下,您可以创建Regexp启发式,依赖于希望没有人会在您的代码中编写“邪恶”字符串,例如/= *(".+") *$//\w+ *\(* *(".+") *\)* *$/。该启发式方法会提取一些字符串嫌疑人,您可以进一步应用我在上面写的方法。但我仍然需要人工查看每个替换,然后对生成的代码运行测试。