Существует ли Java-метод, который работает как репозиторий Python? Например, если предположить, что функция была названа магнезии,Java-эквивалент Python repr()?
"foo\n\tbar".repr()
вернется
"foo\n\tbar"
не
foo bar
, как ToString делает.
Существует ли Java-метод, который работает как репозиторий Python? Например, если предположить, что функция была названа магнезии,Java-эквивалент Python repr()?
"foo\n\tbar".repr()
вернется
"foo\n\tbar"
не
foo bar
, как ToString делает.
Если вы собираетесь использовать это только в строках, вы можете просто написать метод, который проходит через строку и заменяет специальные символы (для любого определения «специального», которое вы хотите) с их escape-кодами , Это то, что я сделал бы. (Я сделал быстрый поиск, и на Google ничего не появилось, поэтому было бы быстрее просто написать метод, чем искать существующую реализацию).
Это будет сделано, но это немного взломанный, он использует 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);
Если бы такой метод, было бы написание quines в Java очень легко, потому что это позволит решить проблему избежать кавычки. Увидев, что простейшие quines в Java требуют ручного ввода символа кавычки вручную с его символьным кодом, маловероятно, что такой метод существует.
не думаю, что есть конкретный метод - но это будет решить без 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;
}
}
В некоторых проектах я использую следующую вспомогательную функцию, чтобы сделать что-то похожее в предст Пайтона для строк:
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 s не фильтруют только ограниченный набор непечатаемых символов (например, заменяют решения на основе), а просто все непечатаемые символы ASCII. Некоторые из них могли быть написаны немного лучше, но на самом деле он выполняет свою работу ...
Обратите внимание, что, как и функция Python, этот будет окружать строку кавычками. Если вы не хотите этого, вам придется устранить Append («"») вызовы до и после в то время как петля.
Оказывается, что Jython уже делает это. Вы могли бы, в теории, включают в себя Jython jar, запускать интерпретатор и фактически запускать rep (object) для объекта, о котором идет речь. Вероятно, больше накладных расходов, чем вы хотите, но делает то, что вы описываете.
Если вы хотите встроить интерпретатор Jython в приложение , рассмотрите http://wiki.python.org/jython/JythonFaq/EmbeddingJython.
Java не имеет функции репрезентации, но repr имеет вас в бухте красный (Полное раскрытие: я являюсь автором издания).
Использовать статический метод escapeJava
от Commons Lang StringEscapeUtils
класс.
String repr = "\"" + StringEscapeUtils.escapeJava(myString) + "\"";
В случае, если вы используете Groovy, он обеспечивает аналогичный StringEscapeUtils
class, как Apache Commons Lang:
StringEscapeUtils.escapeJava("foo\n\tbar")
ли опубликована на Maven? – Tobia
Пока нет. Вы первый спросите. – llogiq