有没有一个Java方法可以像Python的repr那样工作?例如,假设函数名为repr,
"foo\n\tbar".repr()
会回来
"foo\n\tbar"
不
foo bar
就像toString一样。
bbmckpt71#
在一些项目中,我使用下面的helper函数来完成类似于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('"') 调用。
cyvaqqii2#
Java没有repr-Function,但是repr可以满足您的需求(完全公开:repr)的作者我。
bvjxkvbb3#
使用Apache Commons Text中StringEscapeUtils类的静态方法escapeJava。
StringEscapeUtils
escapeJava
String repr = "\"" + StringEscapeUtils.escapeJava(myString) + "\"";
xdyibdwo4#
这样就可以了,但是有点麻烦,它使用了来自Common Lang的StringUtils和replaceEach来实现一个简单的替换:
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);
j2cgzkjk5#
我不认为有一个特定的方法--但这将解决它没有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; }
}
llycmphe6#
如果您使用的是Groovy,它会提供一个类似于Apache Commons Lang的StringEscapeUtils类:
StringEscapeUtils.escapeJava("foo\n\tbar")
plupiseo7#
如果你只打算在字符串上使用这个方法,在紧要关头你可以写一个方法,遍历字符串并用转义码替换特殊字符(不管你想要什么定义的“特殊”)。这就是我要做的。(我在Google上做了一个快速搜索,没有找到任何结果,所以写一个方法可能比寻找一个现有的实现要快。)
xdyibdwo8#
如果有这样的方法,那么在Java中编写quine就变得非常容易了,因为它解决了引号转义的问题。鉴于Java中最简单的quine都需要手动插入引号字符及其字符代码,因此不太可能存在这样的方法。
x0fgdtte9#
Jython似乎已经做到了这一点。理论上,您可以包含Jython jar,启动一个解释器,然后实际上在所讨论的对象上运行repr(object)。开销可能比您希望的要多,但确实做到了您所描述的。如果您希望在应用程序中嵌入Jython解释器,请考虑http://wiki.python.org/jython/JythonFaq/EmbeddingJython。
9条答案
按热度按时间bbmckpt71#
在一些项目中,我使用下面的helper函数来完成类似于Python的字符串 repr 的功能:
与这里给出的许多其他解决方案相比,它的主要优点是,它不仅过滤了有限的不可打印字符集(像那些基于 replace 的解决方案),而且过滤了所有不可打印的ASCII字符。其中一些字符本可以写得稍微好一点,但它确实完成了它的工作...
注意,和Python函数一样,这个函数也会用引号把字符串括起来,如果你不想这样,你必须去掉 while 循环前后的 append('"') 调用。
cyvaqqii2#
Java没有repr-Function,但是repr可以满足您的需求(完全公开:repr)的作者我。
bvjxkvbb3#
使用Apache Commons Text中
StringEscapeUtils
类的静态方法escapeJava
。xdyibdwo4#
这样就可以了,但是有点麻烦,它使用了来自Common Lang的StringUtils和replaceEach来实现一个简单的替换:
j2cgzkjk5#
我不认为有一个特定的方法--但这将解决它没有commons lang:
}
llycmphe6#
如果您使用的是Groovy,它会提供一个类似于Apache Commons Lang的
StringEscapeUtils
类:plupiseo7#
如果你只打算在字符串上使用这个方法,在紧要关头你可以写一个方法,遍历字符串并用转义码替换特殊字符(不管你想要什么定义的“特殊”)。这就是我要做的。(我在Google上做了一个快速搜索,没有找到任何结果,所以写一个方法可能比寻找一个现有的实现要快。)
xdyibdwo8#
如果有这样的方法,那么在Java中编写quine就变得非常容易了,因为它解决了引号转义的问题。鉴于Java中最简单的quine都需要手动插入引号字符及其字符代码,因此不太可能存在这样的方法。
x0fgdtte9#
Jython似乎已经做到了这一点。理论上,您可以包含Jython jar,启动一个解释器,然后实际上在所讨论的对象上运行repr(object)。开销可能比您希望的要多,但确实做到了您所描述的。
如果您希望在应用程序中嵌入Jython解释器,请考虑http://wiki.python.org/jython/JythonFaq/EmbeddingJython。