0

次の文字列があります。

coolStr = '<!--  \\n    @author       Phil R\\n    @date         6.5.2012\\n    @description  Me T\\\\nesting S\\\\\\\\ntuff\\n-->'

この文字列は二重にエスケープされているようです。文字列を次のように変更したいと思います。

newCoolStr = "<!--  \n    @author       Phil R\n    @date         6.5.2012\n    @description  Me T\\nesting S\\\\ntuff\n-->"

あなたが書いた場合:

puts newCoolStr

あなたは得るでしょう:

<!--  
    @author       Phil R
    @date         6.5.2012
    @description  Me T\nesting S\\ntuff
-->

私はこれをするのに失敗してきました。私が得ることができる最も近いものは、次のようにバックスラッシュを半分にすることです:

coolStr.gsub(/\\\\/) {'\\'}

しかし、理由がわかりませんが、これが「\\n」のインスタンスをキャッチしないため、改行と最初に「\\\\n」として表示されたものとの間に区別がないこのシナリオになります。例:

<!--  \\n    @author       Phil R\\n    @date         6.5.2012\\n    @description  Me T\\nesting S\\\\ntuff\\n-->

かなり単純な問題のように思えますが、私はそれを理解できないようです。これを達成する最良の方法は何ですか?

4

2 に答える 2

1

1 つの問題は、文字列の改行が ruby​​ による改行ではないことです。n文字に隣接するエスケープされたバックスラッシュです。

あなたは出来る

gsub(/\\+n/,"\n")

ただし、必要な改行と、エスケープしたくない説明内のものを区別する方法が必要です。それはあなたのアプリにもっと結びついています。

この場合、改行の後に単語文字が続く場合、それをテキストとして扱うことができます。

str =  "coolStr = '<!--  \\n    @author       Phil R\\n    @date         6.5.2012\\n    @description  Me T\\\\nesting S\\\\\\\\ntuff\\n-->'"

puts str.gsub(/\\+n(?!\w)/,"\n")

coolStr = '<!--  
@author       Phil R
@date         6.5.2012
@description  Me T\\nesting S\\\\ntuff
-->'
于 2012-06-10T22:15:58.657 に答える
0

私はGreyCatのソリューションに出くわしました:

Ruby から C スタイルのエスケープシーケンスをエスケープ解除するにはどうすればよいですか?

これはまさに私が必要としていたものです。二重エスケープを削除し、私の問題を解決します。GreyCatのソリューションに賛成し、これを自分の質問への回答としてマークしました。

于 2012-06-10T18:30:03.140 に答える