Java等同于Python repr()?

问题描述 投票:23回答:9

是否有一个像Python的repr一样工作的Java方法?例如,假设函数被命名为repr,

"foo\n\tbar".repr()

将返回

“ foo \ n \ tbar”

不是

foo        酒吧

与toString一样。

java python repr
9个回答
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();
    }
}

与此处提供的许多其他解决方案相比,它的主要优点是,它不仅仅过滤有限的一组不可打印字符(如那些基于replace的解决方案),而且仅过滤所有不可打印的ASCII字符。其中一些本来可以写得更好一些,但实际上可以完成工作...

[请注意,就像Python函数一样,此函数将用引号将字符串引起来。如果您不希望这样做,则必须消除while循环之前和之后的append('“'))>>调用。


5
投票

Java没有repr-Function,但是repr让您了解了(全部披露:我是repr的作者)。


4
投票

使用escapeJavaStringEscapeUtils类的静态方法Apache Commons Text。>

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

1
投票

这可以做到,但是有点麻烦,它使用Common Lang中的StringUtilsreplaceEach


1
投票

不要以为有一种特定的方法,但这可以在没有公共语言的情况下解决:


0
投票

[如果只打算在字符串上使用此代码,则在紧要关头,您可以编写一个遍历字符串的方法,并用其转义码替换特殊字符(对于所需的“特殊”的任何定义)。那就是我会做的。 (我进行了快速搜索,但Google没发现任何问题,因此编写该方法可能比寻找现有的实现要快)


0
投票

如果有这样一种方法,它将使用Java编写quines非常容易,因为它将解决转义引号的问题。由于Java中最简单的quines都需要手动将引号字符及其字符代码手动插入,因此不太可能存在这种方法。


0
投票

看来Jython已经做到了。从理论上讲,您可以包括Jython jar,启动解释器,然后在所讨论的对象上实际运行repr(object)。可能比您想要的要多,但确实可以满足您的描述。


0
投票

如果您使用的是Groovy

© www.soinside.com 2019 - 2024. All rights reserved.