Ruby中单引号到双引号的智能转换

问题

在源文件中,我有大量的strings.ome有插值,有些有特殊符号,有些没有。

我试图解决,如果我可以用双引号替换单引号,同时转换转义的单引号字符。 然后我会在一个或多个源代码文件上运行此转换。

示例 – 代码

想象一下以下代码:

def myfunc(var, var2 = 'abc') s = 'something' puts 'a simple string' puts 'string with an escaped quote \' in it' x = "nasty #{interpolated}" + s + ' and single quote combo' puts "my #{var}" end 

示例 – 结果

我想把它变成这样:

 def myfunc(var, var2 = "abc") s = "something" puts "a simple string" puts "string with an escaped quote ' in it" x = "nasty #{interpolated}" + s + " and single quote combo" puts "my #{var}" end 

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

你想要负面看(?运算符:

正则表达式

  (? 

DEMO

http://regex101.com/r/rN5eE6

说明

  • 您想要替换任何前面没有反斜杠的单引号。
  • 不要忘记查找并替换所有\''

还有更多

对于这个用例,即使它是一个简单的用例,ruby解析器也会表现得更好。

正如彼得·汉密尔顿指出的那样,虽然用双引号等同替换单引号字符串起初看起来似乎是一项容易的任务,即使用regexen也不能轻易完成,主要是由于“错误”中单引号的可能性放置“,例如在双引号字符串中, %q文字字符串结构,heredocs,注释……

 x = 'puts "foo"' y = %/puts 'foo'/ # TODO: Replace "x = %/puts 'foo'/" with "x = %#puts 'bar'#" 

但在这种情况下,正确的解决方案比其他方式(双引用单引号)容易得多,实际上可以部分实现:

 require 'ripper' require 'sorcerer' # gem install sorcerer if necessary my_source = <<-source x = 'puts "foo"' y = "puts 'bar'" source sexp = Ripper::SexpBuilder.new( my_source ).parse double_quoted_source = Sorcerer.source sexp #=> "x = \"puts \"foo\"\"; y = \"puts 'bar'\"" 

我说“部分可以获得”的原因是,正如你自己可以看到的那样,

 puts double_quoted_source #=> x = "puts "foo""; y = "puts 'bar'" 

巫师忘记在以前的单引号字符串中删除双引号。 随意向巫师的作者Jim Weirich提交补丁,以解决问题。