2

問題

ソース ファイルに多数の文字列があります。補間のあるもの、特殊なシンボルのあるもの、どちらでもないものがあります。

単純な文字列の二重引用符を単一引用符に置き換え、補間された特殊な記号文字列の二重引用符を残すことができるかどうかを調べようとしています。次に、この変換を 1 つまたは複数のソース コード ファイルに対して実行します。

おそらくこれには素晴らしい正規表現があると思いますが、完全に定式化することはできません。

例 - コード

次のコードを想像してください。

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 ヒューリスティックを作成でき/= *(".+") *$/ます/\w+ *\(* *(".+") *\)* *$/。そのヒューリスティックは、いくつかの文字列の容疑者を抽出し、上で書いた方法をさらに適用できます。しかし、私はまだ各置換を人間に見てもらい、後で結果のコードでテストを実行します.

于 2013-05-14T11:01:11.580 に答える