Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby中单引号到双引号的智能转换 问题_Ruby_Regex - Fatal编程技术网

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

Ruby中单引号到双引号的智能转换 问题,ruby,regex,Ruby,Regex,在源文件中,我有大量strings.ome和interpolation,有些带有特殊符号,有些则两者都没有 我正在尝试在转换转义的单引号字符时,用双引号替换单引号。然后,我将在一个或多个源代码文件上运行此转换 示例-代码 想象一下下面的代码: def myfunc(var, var2 = 'abc') s = 'something' puts 'a simple string' puts 'string with an escaped quote \' in it' x = "n

在源文件中,我有大量strings.ome和interpolation,有些带有特殊符号,有些则两者都没有

我正在尝试在转换转义的单引号字符时,用双引号替换单引号。然后,我将在一个或多个源代码文件上运行此转换

示例-代码 想象一下下面的代码:

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

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

您想要反向查找
(?运算符:

REGEX

 (?<!\)'
(?\”
还有更多


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

您想要反向查找
(?操作符:

REGEX

 (?<!\)'
(?\”
还有更多


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

正如Peter Hamilton指出的,虽然用双引号等价物替换单引号字符串一开始似乎很容易,但即使是用regexen也不容易做到,这主要是因为在e“错误的位置”,例如在双引号字符串中,
%q
文本字符串构造、继承、注释

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'\""

巫师忘记在以前的单引号字符串中转义双引号。请放心,这会解决问题。

正如彼得·汉密尔顿所指出的,虽然用双引号等价物替换单引号字符串一开始可能看起来很容易,但即使使用regexen也不容易,这主要要感谢pos单引号在“错误位置”的可能性,例如在双引号字符串中,
%q
文字字符串构造、继承、注释

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'\""

巫师忘记在以前的单引号字符串中转义双引号。请放心,这会解决问题。

您能发布您尝试过的内容吗?您能发布您尝试过的内容吗?我发现的一件事是双引号中的单引号没有被捕获。在我最初的示例中没有。对于您指出的问题,您已经达到了目标正则表达式的限制。ruby解析器更适合解决此问题。我发现一件事是双引号中的单引号没有被捕获。在我的原始示例中没有。根据您指出的问题,您已经达到了正则表达式的限制。ruby解析器更适合解决此问题。