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

时间:2013-05-14 10:35:02

标签: ruby regex

问题

在源文件中,我有大量的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

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

2 个答案:

答案 0 :(得分:3)

你想要(?<!)运算符背后的负面看法:

<强> REGEX

 (?<!\)'

<强>样本

http://regex101.com/r/rN5eE6

<强>说明

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

还有更多

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

答案 1 :(得分:2)

正如彼得·汉密尔顿所指出的那样,虽然用双引号等同替换单引号字符串起初看起来似乎是一件容易的事,但即使用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'"

Sorcerer忘记在以前的单引号字符串中转义双引号。感觉免费to submit a patch to sorcerer's author Jim Weirich可以解决问题。