4

JavaTokenParsersin Scalaは、整数と浮動小数点数、および二重引用符で囲まれた文字列を照合するための便利な正規表現を提供します。しかし、それがすべてです。これらの文字列を基になる変換オブジェクトに変換するという明白なことをどのように行うのですか?toDoubleこれは、数値、またはなどを使用する場合に非常に簡単に実行toIntできます。しかし、文字列に相当するものをどのように実行しますか?たとえば、文字列を入力した場合

"Unicode \u20ac is a Euro sign, which I would write \\u20ac in a string. \243 is a pound sign.\n\r And \f is a \"form feed\", with embedded quotes.\n\r"

次に、これを実行するとJavaTokenParsers、埋め込まれた引用符を正しく解析する文字列が正しく返されますが、最初と最後の文字として二重引用符文字があり、多くのバックスラッシュシーケンスがあります。エスケープシーケンスが処理された同等のJava文字列を取得するにはどうすればよいですか?これを行うためのライブラリ関数がないとは信じられませんが、見つけることができません。

4

2 に答える 2

2

そのような関数はないようです—少なくとも、Scalaコンパイラーでは何も使用されていません。それは決定的な答えではありませんが、おそらくライブラリ関数が後で導入されました。

このコードを読みたい(またはコピーアンドペーストしたい)場合は、これが私が見つけた関連コードです。Scalaコンパイラのトークン化ロジックは、さまざまなファイルに分散されています。トップレベルのメソッドはにあるようfetchTokenです。これは、特にとのsrc/compiler/scala/tools/nsc/ast/parser/Scanners.scalaロジックに委任しますsrc/compiler/scala/tools/nsc/util/CharArrayReader.scala(その祖先の1つ)。その他のエスケープは、で処理されます。nextCharpotentialUnicodegetLitCharScanners.scala

于 2012-07-02T03:18:07.667 に答える
0

OK、少し見回しました。stackoverflowに関する別の質問は、関連する問題に対処しているようです。

JavaでJava文字列リテラルをエスケープ解除するにはどうすればよいですか?

TomChristiansenからこれを行うためのソースコードがいくつかあります。

また、ApacheCommonsにはこれを行う機能があることもわかりました。

org.apache.commons3.lang.StringEscapeUtils.unescapeJava()

8進数のエスケープを処理する場合は、Commons3バージョンを使用する必要があります。上記のChristiansenによるバージョンには、Javaには存在しない他の場所で見られる一般的なエスケープシーケンス(Java正規表現、PerlおよびPythonエスケープ、Cエスケープなど)を処理するという点で、より多くの機能があります。

  1. \aベル(\007)の場合\e、ESCの場合
  2. \UXXXXXXXXUCS-4フルUnicodeコードポイント(BMPにないものを含む)の場合
  3. \xXX16進エスケープの場合
  4. \cXコントロールエスケープの場合、例:\cH= ^H= \b=\010
  5. \0NULLの場合(\000
于 2012-07-03T03:38:45.230 に答える