2013-05-14 80 views
2

问题

在源文件中,我有大量的字符串。有些采用插值法,有些采用特殊符号,有些则不采用。红宝石智能双引号转换为单引号

我想解决的是,如果我可以用单引号替换简单字符串的双引号,而为插入和特殊符号字符串留下双引号。然后,我会在一个或多个源代码文件上运行此转换。

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

实例 - 代码

想象一下下面的代码:

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 

如果任何人有任何我会很感激的想法!

+0

您想在实际的源文件中进行此更改,对不对? – Dogbert 2013-05-14 10:34:10

+0

是的,理想情况下,我会通过一个或多个文件运行此操作。将更新问题反映。 – 2013-05-14 10:35:40

+0

你为什么如此固定regexen? – 2013-05-14 10:47:01

回答

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 
} 

这安全水平4只是木匠,只是我承认我们正在做一些危险的事情。我不知道它在多大程度上抵御了所有的危险。

在您的具体情况下,您可以创建正则表达式启发式方法,依赖于希望没有人会在代码中编写“邪恶”字符串,例如/= *(".+") *$//\w+ *\(* *(".+") *\)* *$/。该启发式将提取一些字符串嫌疑犯,你可以进一步运用我在前面写得更高的方法。但是我仍然会对每一个替换者进行人性化的观察,然后对结果代码进行测试。

+0

谢谢,但这将如何适用? – 2013-05-14 11:05:54

+0

@PeterHamilton:'“\”'#{'“\”“#{”'“'”}'\“\”'}“'”''。或者查看http://mamememo.blogspot.com。你有问题吗? – 2013-05-14 11:18:01

+0

这是怎么处理'“#{method_which_isnt_visible_from_converter_context(args)}”'? – dbenhur 2013-05-14 14:21:19