2009-08-29 14 views
22

Pythonのreprのように動作するJavaメソッドがありますか?例えば、Python repr()に相当するJava?

"foo\n\tbar".repr() 

はない

foo 
     bar

のtoStringが行うように

"foo\n\tbar"

を返す、関数がのrepr命名したと仮定。

答えて

0

これを文字列でしか使用しない場合は、文字列を通過して特殊文字(エスケープコードで希望する「特別」の定義どおり)を置き換えるメソッドを書くことができます。それは私がやることです。 (私はクイック検索を行い、Google上に何も出なかったので、既存の実装を探すよりもメソッドを書く方が速いかもしれません)

1

これはやりますが、それはちょっとしたハックです置き換えるシンプルを達成するための共通のラングからStringUtilsreplaceEach

String hello = "hello\n\tworld\n\n\t";  
     String replaced = StringUtils.replaceEach(hello, new String[] {"\n", "\t", "\r", "\f"}, 
                 new String[] {"\\n", "\\t", "\\r", "\\f"}); 
     System.out.println("Replaced " + replaced); 
0

、このような方法があった場合は、引用符をエスケープする問題を解決するだろうので、それは、Javaで書き込みquinesは本当に簡単になるだろう。 Javaの中で最もシンプルなものを見るためには、手動で文字コードを手動で引用符文字を挿入する必要がありますが、そのようなメソッドは存在しません。

1

は、特定の方法はないと思う - しかし、これはコモンズLANGせずに、それを解決します:いくつかのプロジェクトで

public class test { 

public test() throws Exception { 
    byte[] hello = "hello\n\tworld\n\n\t".getBytes(); 
    System.out.println(new String(hexToByte(stringToHex(hello).replaceAll("0a", "5c6e") 
                   .replaceAll("09", "5c74")))); 
} 

public static void main(String[] args) throws Exception { 
    new test(); 
} 

public static String stringToHex(byte[] b) throws Exception { 
    String result = ""; 
    for (int i = 0; i < b.length; i++) { 
     result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1); 
    } 
    return result; 
} 

public static byte[] hexToByte(String s) { 
    int len = s.length(); 
    byte[] data = new byte[len/2]; 
    for (int i = 0; i < len; i += 2) { 
     data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16)); 
    } 
    return data; 
} 

}

8

、私は似た何かを達成するために、次のヘルパー関数を使用します文字列のPythonののreprへ:

private static final char CONTROL_LIMIT = ' '; 
private static final char PRINTABLE_LIMIT = '\u007e'; 
private static final char[] HEX_DIGITS = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; 

public static String toPrintableRepresentation(String source) { 

    if(source == null) return null; 
    else { 

     final StringBuilder sb = new StringBuilder(); 
     final int limit = source.length(); 
     char[] hexbuf = null; 

     int pointer = 0; 

     sb.append('"'); 

     while(pointer < limit) { 

      int ch = source.charAt(pointer++); 

      switch(ch) { 

      case '\0': sb.append("\\0"); break; 
      case '\t': sb.append("\\t"); break; 
      case '\n': sb.append("\\n"); break; 
      case '\r': sb.append("\\r"); break; 
      case '\"': sb.append("\\\""); break; 
      case '\\': sb.append("\\\\"); break; 

      default: 
       if(CONTROL_LIMIT <= ch && ch <= PRINTABLE_LIMIT) sb.append((char)ch); 
       else { 

        sb.append("\\u"); 

        if(hexbuf == null) 
         hexbuf = new char[4]; 

        for(int offs = 4; offs > 0;) { 

         hexbuf[--offs] = HEX_DIGITS[ch & 0xf]; 
         ch >>>= 4; 
        } 

        sb.append(hexbuf, 0, 4); 
       } 
      } 
     } 

     return sb.append('"').toString(); 
    } 
} 

ここに与えられた他のソリューションの多く以上、その主な利点は、DOEということであり、限られた印刷不能文字(に置き換えたものなど)だけをフィルタリングするのではなく、すべての印刷不能なASCII文字をフィルタリングします。その一部は少し上手く書かれているかもしれませんが、実際には仕事をしています...

Python関数と同様に、この文字列は引用符で囲まれています。あなたがいることをしたくない場合は、あなたが通話 whileループの前と後(「"」)APPENDを排除する必要があります。

0

を含まれています。あなたは可能性が、理論的には、Jythonのは、すでにこれを行いますことが表示されますJython jar、インタプリタを起動して、問題のオブジェクトに対して実際にrepr(オブジェクト)を実行することができます。

アプリケーションにJythonインタプリタを埋め込みたい場合、考えてくださいhttp://wiki.python.org/jython/JythonFaq/EmbeddingJython

5

Javaはrepr機能を持っていませんが、reprあなたを持っている赤(完全開示:私はreprの著者です)。

+0

は、Mavenの上で発表されますか? – Tobia

+0

まだありません。あなたは最初に尋ねます。 – llogiq

3

Commons Lang StringEscapeUtilsクラスの静的メソッドescapeJavaを使用します。あなたはGroovyのを使用している場合は

String repr = "\"" + StringEscapeUtils.escapeJava(myString) + "\"";