2009-08-29 5 views
22

Существует ли Java-метод, который работает как репозиторий Python? Например, если предположить, что функция была названа магнезии,Java-эквивалент Python repr()?

"foo\n\tbar".repr() 

вернется

"foo\n\tbar"

не

foo 
     bar

, как ToString делает.

ответ

0

Если вы собираетесь использовать это только в строках, вы можете просто написать метод, который проходит через строку и заменяет специальные символы (для любого определения «специального», которое вы хотите) с их escape-кодами , Это то, что я сделал бы. (Я сделал быстрый поиск, и на Google ничего не появилось, поэтому было бы быстрее просто написать метод, чем искать существующую реализацию).

1

Это будет сделано, но это немного взломанный, он использует 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); 
0

Если бы такой метод, было бы написание quines в Java очень легко, потому что это позволит решить проблему избежать кавычки. Увидев, что простейшие quines в Java требуют ручного ввода символа кавычки вручную с его символьным кодом, маловероятно, что такой метод существует.

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; 
} 

}

8

В некоторых проектах я использую следующую вспомогательную функцию, чтобы сделать что-то похожее в предст Пайтона для строк:

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 («"») вызовы до и после в то время как петля.

0

Оказывается, что Jython уже делает это. Вы могли бы, в теории, включают в себя Jython jar, запускать интерпретатор и фактически запускать rep (object) для объекта, о котором идет речь. Вероятно, больше накладных расходов, чем вы хотите, но делает то, что вы описываете.

Если вы хотите встроить интерпретатор Jython в приложение , рассмотрите http://wiki.python.org/jython/JythonFaq/EmbeddingJython.

5

Java не имеет функции репрезентации, но repr имеет вас в бухте красный (Полное раскрытие: я являюсь автором издания).

+0

ли опубликована на Maven? – Tobia

+0

Пока нет. Вы первый спросите. – llogiq

3

Использовать статический метод escapeJava от Commons Lang StringEscapeUtils класс.

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

В случае, если вы используете Groovy, он обеспечивает аналогичный StringEscapeUtils class, как Apache Commons Lang:

StringEscapeUtils.escapeJava("foo\n\tbar") 

 Смежные вопросы

  • Нет связанных вопросов^_^