25

Python の repr のように機能する Java メソッドはありますか? たとえば、関数の名前が repr であると仮定すると、

"foo\n\tbar".repr()

戻るだろう

"foo\n\tbar"

いいえ

ふー
        バー

toString と同様です。

4

9 に答える 9

9

一部のプロジェクトでは、次のヘルパー関数を使用して、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();
    }
}

ここで示した他の多くのソリューションに対する主な利点は、印刷できない文字の限られたセット(置換ベースのソリューションなど)だけでなく、印刷できないすべてのASCII文字をフィルタリングすることです。それのいくつかは少し良く書かれているかもしれません、しかしそれは実際にその仕事をします...

Python関数と同様に、これは文字列を引用符で囲むことに注意してください。これを望まない場合は、 whileループの前後のappend('"')呼び出しを削除する必要があります。

于 2009-08-29T17:49:30.423 に答える
6

Apache Commons TextescapeJavaStringEscapeUtilsクラスの static メソッドを使用します。

String repr = "\"" + StringEscapeUtils.escapeJava(myString) + "\"";
于 2014-05-30T15:00:31.170 に答える
5

Java には repr-Function はありませんが、repr で対応できます (完全開示: 私は repr の作成者です)。

于 2013-09-10T15:21:57.637 に答える
1

特定の方法があるとは思わないでください -- しかし、これは commons 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;
}

}

于 2009-08-29T11:41:40.687 に答える
1

これで実行できますが、少しハックです。Common Lang の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);
于 2009-08-29T05:10:53.763 に答える
0

Jythonはすでにこれを行っているようです。理論的には、Jython jarを含め、インタープリターを起動し、問題のオブジェクトに対して実際にrepr(object)を実行することができます。おそらくあなたが望むよりもオーバーヘッドが多いですが、あなたが説明したことを正確に実行します。

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

于 2009-08-29T21:08:56.340 に答える
0

このような方法があれば、引用符をエスケープする問題が解決されるため、Java での quines の作成が非常に簡単になります。Java の最も単純なクインはすべて、その文字コードを使用して引用符を手動で挿入する必要があるため、そのような方法が存在する可能性は低いです。

于 2009-08-29T08:06:50.493 に答える
0

Groovyを使用している場合は、 Apache Commons Langと同様StringEscapeUtilsのクラスが提供されます。

StringEscapeUtils.escapeJava("foo\n\tbar")
于 2015-08-29T08:52:44.400 に答える