2009-08-29 15 views
22

वहाँ एक जावा विधि है कि अजगर के रेपर की तरह काम करता है? उदाहरण के लिए, यह सोचते हैं समारोह रेपर नाम थे,जावा समकक्ष()?

"foo\n\tbar".repr() 

"foo\n\tbar"

नहीं

foo 
     bar

रूप toString करता लौट आते हैं।

उत्तर

0

यदि आप केवल तारों पर इसका उपयोग करने जा रहे हैं, तो चुटकी में आप केवल एक विधि लिख सकते हैं जो स्ट्रिंग के माध्यम से जाता है और विशेष पात्रों को बदलता है (जो भी "विशेष" आप चाहते हैं "के लिए परिभाषा) । मैं यही करूंगा। (मैंने एक त्वरित खोज की और 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 लेखन बनाने क्योंकि यह उद्धरण से बचने की समस्या का समाधान होगा। के रूप में जावा में सरल quines सभी मैन्युअल रूप से उद्धरण कैरेक्टर मैन्युअल अपने चरित्र कोड के साथ डालने की आवश्यकता होती है देखकर, यह है कि इस तरह के एक विधि मौजूद है संभावना नहीं है।

1

किसी विशिष्ट विधि नहीं लगता कि - लेकिन इस कॉमन्स लैंग के बिना इसे हल करेंगे:

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: स्ट्रिंग्स के लिए पायथन के रेपर को केवल प्रिंट न हो सकने वर्ण (उन तरह आधारित समाधान की जगह) के एक सीमित सेट है, लेकिन बस सभी प्रिंट न हो सकने ASCII वर्ण फ़िल्टर नहीं रहा है। कुछ का यह थोड़ा अच्छे से लिखा जा सकता था किया गया है, लेकिन यह वास्तव में अपना काम ...

ध्यान दें, कि अजगर समारोह की तरह, यह एक उद्धरण के साथ स्ट्रिंग के चारों ओर जाएगा करता है। आपको लगता है कि नहीं करना चाहती हैं, तो आप कॉल से पहले संलग्न ('' ') को खत्म करने की है और बाद जबकि पाश।

0

ऐसा प्रतीत होता है Jython पहले से ही इस करता है। आप सकता है, सिद्धांत रूप में, शामिल होंगे ज्योथन जार, एक दुभाषिया स्टार्टअप, और वास्तव में प्रश्न में ऑब्जेक्ट पर repr (ऑब्जेक्ट) चलाता है। संभवत: आप जो चाहते हैं उससे अधिक ओवरहेड करते हैं, लेकिन आप जो भी वर्णन करते हैं, वही करता है।

यदि आप अपने आवेदन में ज्योथन दुभाषिया को एम्बेड करना चाहते हैं , http://wiki.python.org/jython/JythonFaq/EmbeddingJython पर विचार करें।

5

जावा में कोई repr-Function नहीं है, लेकिन repr आपको कोव मिला है लाल (पूर्ण प्रकटीकरण: मैं रेपर के लेखक हूँ)।

+0

यह Maven पर प्रकाशित है? – Tobia

+0

अभी तक नहीं। आप पूछने वाले पहले व्यक्ति हैं। – llogiq

3

कॉमन्स लैंग StringEscapeUtils कक्षा से स्थिर विधि escapeJava का उपयोग करें।

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

मामले में आप ग्रूवी उपयोग कर रहे हैं, यह अपाचे कॉमन्स लैंग के रूप में एक ऐसी ही StringEscapeUtils class प्रदान करता है:

StringEscapeUtils.escapeJava("foo\n\tbar") 
संबंधित मुद्दे