在源文件中,我有大量的字符串。有些是插值,有些是特殊符号,有些没有。
我试图弄清楚如果我可以用单引号替换简单字符串的双引号,同时为插值和特殊符号字符串留下双引号。然后我会在一个或多个源代码文件上运行此转换。
我想可能有一个很好的正则表达式,但我不能完全表达它。
想象一下以下代码:
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 :(得分: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+ *\(* *(".+") *\)* *$/
。该启发式方法会提取一些字符串嫌疑人,您可以进一步应用我在上面写的方法。但我仍然需要人工查看每个替换,然后对生成的代码运行测试。