2011-08-12 7 views
13

में संपीड़ित रूप में आईपीवी 6 पता मैंने आईपीवी 6 पते को संपीड़ित करने के लिए Inet6Address.getByName("2001:db8:0:0:0:0:2:1").toString() विधि का उपयोग किया है, और आउटपुट 2001:db8:0:0:0:0:2:1 है, लेकिन मुझे 2001:db8::2:1 की आवश्यकता है। , मूल रूप से संपीड़न उत्पादन पर RFC 5952 standard आधारित होना चाहिए, वह यह है किजावा

1) Shorten as Much as Possible: उदाहरण के लिए, 2001: db8: 0: 0: 0: 0: 2: 1 छोटा किया जाना चाहिए करने के लिए
2001: db8 :: 2 : 1. इसी तरह, 2001: डीबी 8 :: 0: 1 स्वीकार्य नहीं है, क्योंकि प्रतीक "::" का उपयोग छोटे प्रतिनिधित्व 2001: डीबी 8 :: 1 के उत्पादन के लिए किया जा सकता था।

2) Handling One 16-Bit 0 Field: प्रतीक "::" केवल एक 16-बिट 0 फ़ील्ड को छोटा करने के लिए उपयोग नहीं किया जाना चाहिए। उदाहरण के लिए, प्रतिनिधित्व 2001: डीबी 8: 0: 1: 1: 1: 1: 1 सही है, लेकिन 2001: डीबी 8 :: 1: 1: 1: 1: 1 सही नहीं है।

3) Choice in Placement of "::" : = जब वहाँ के एक "::", लगातार 16-बिट 0 क्षेत्रों में सबसे लंबे समय तक चलाने के लिए छोटा किया जाना चाहिए (यानी, लगातार तीन शून्य क्षेत्रों के साथ अनुक्रम है नियुक्ति में एक वैकल्पिक विकल्प है 2001 में छोटा: 0: 0: 1: 0: 0: 0: 1)। जब लगातार 16-बिट 0 फ़ील्ड की लंबाई बराबर होती है (यानी, 2001: डीबी 8: 0: 0: 1: 0: 0: 1), शून्य बिट्स का पहला अनुक्रम छोटा होना चाहिए। उदाहरण के लिए, 2001: डीबी 8 :: 1: 0: 0: 1 सही प्रतिनिधित्व है।

मैंने another post in Stack overflow पर भी जांच की है, लेकिन कोई शर्त निर्दिष्ट नहीं है (उदाहरण के लिए प्लेसमेंट विकल्प: :)।

क्या इसे संभालने के लिए कोई जावा लाइब्रेरी है? क्या कोई मेरी मदद कर सकता है?

अग्रिम धन्यवाद।

उत्तर

18

इस बारे में कैसे? जावा डबल बैकस्लैश नरक के बिना

String resultString = subjectString.replaceAll("((?::0\\b){2,}):?(?!\\S*\\b\\1:0\\b)(\\S*)", "::$2"); 

स्पष्टीकरण:

(  # Match and capture in backreference 1: 
(?: # Match this group: 
    :0 # :0 
    \b # word boundary 
){2,} # twice or more 
)  # End of capturing group 1 
:?  # Match a : if present (not at the end of the address) 
(?!  # Now assert that we can't match the following here: 
\S* # Any non-space character sequence 
\b  # word boundary 
\1  # the previous match 
:0  # followed by another :0 
\b  # word boundary 
)  # End of lookahead. This ensures that there is not a longer 
     # sequence of ":0"s in this address. 
(\S*) # Capture the rest of the address in backreference 2. 
     # This is necessary to jump over any sequences of ":0"s 
     # that are of the same length as the first one. 

इनपुट:

2001:db8:0:0:0:0:2:1 
2001:db8:0:1:1:1:1:1 
2001:0:0:1:0:0:0:1 
2001:db8:0:0:1:0:0:1 
2001:db8:0:0:1:0:0:0 

आउटपुट:

2001:db8::2:1 
2001:db8:0:1:1:1:1:1 
2001:0:0:1::1 
2001:db8::1:0:0:1 
2001:db8:0:0:1:: 

(मुझे आशा है कि आखिरी उदाहरण सही है - या अगर कोई पता 0 में समाप्त होता है?)

+0

विश अनुसार प्रारूप है मैं कर सकता बस +1 की तुलना में अधिक पूरी तरह से स्पष्टीकरण के लिए –

+0

+1 बहुत प्रभावशाली –

+0

@ टिम बहुत बढ़िया .... आपके उत्कृष्ट उत्तर के लिए बहुत बहुत धन्यवाद। – Tony

9

मैंने हाल ही में एक ही समस्या में भाग लिया और टिम के जवाब पर (बहुत थोड़ा) सुधार करना चाहते हैं।

((?:(?:^|:)0+\\b){2,}):?(?!\\S*\\b\\1:0+\\b)(\\S*)

सबसे पहले, यह परिवर्तन कई शून्यों मैच के लिए शामिल किया गया है:

निम्नलिखित नियमित अभिव्यक्ति दो लाभ प्रदान करता है। दूसरा, यह उन पते से भी सही ढंग से मेल खाता है जहां शून्य की सबसे लंबी श्रृंखला पते की शुरुआत में होती है (जैसे 0:0:0:0:0:0:0:1)।

+0

हालांकि यह नियमित अभिव्यक्ति "0: 0: 0: 0: 0: 0: 0: 0" जैसे पते से संबंधित है और इसे "::" से सही तरीके से छोटा करती है, यह अब शून्य के सबसे लंबे समूह से मेल नहीं खाती है (यानी यह गलत रूप से कम हो जाती है "0: 0: 1: 0: 0: 0: 0: 0" to ":: 1: 0: 0: 0: 0: 0" इसके बजाय "0: 0: 1 ::" – chrixm

+0

यह संकुचित करता है '0000 : 0000: 0000: 0000: 0000: 0000: 0000: 0001' ':: 101 'के बजाय' ::0101' –

1

java-ipv6 लगभग वही है जो आप चाहते हैं। संस्करण 0.10 के अनुसार यह शून्य से सबसे लंबे समय तक चलने की जांच नहीं करता है :: - उदाहरण के लिए 0: 0: 1 :: को छोटा कर दिया गया है :: 1: 0: 0: 0: 0: 0। आईपीवी 6 पते को संभालने के लिए यह एक बहुत ही सभ्य पुस्तकालय है, और यह समस्या fixed with version 0.11 होनी चाहिए, जैसे लाइब्रेरी RFC 5952 compliant है।

0

कुछ परीक्षण करने के बाद, मुझे लगता है कि निम्नलिखित कैप्चर सभी विभिन्न आईपीवी 6 परिदृश्यों:

"((?:(?::0|0:0?)\\b){2,}):?(?!\\S*\\b\\1:0\\b)(\\S*)" -> "::$2" 
1

अमरूद के InetAddresses वर्ग toAddrString() जो आरएफसी के लिए 5952.