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

如果有人有任何想法,我将不胜感激!

4

1 回答 1

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 级简直是胡说八道,只是我承认我们正在做一些危险的事情。我不知道它实际上在多大程度上可以防止所有危险。

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

于 2013-05-14T11:01:11.580 回答