गो

2011-07-21 12 views
31

में "अज्ञात भागने अनुक्रम" त्रुटि में मेरे पास निम्न कार्य लिखा गया है। विचार यह है कि फ़ंक्शन में एक स्ट्रिंग पास हो गई है और पहला आईपीवी 4 आईपी पता मिला है। यदि कोई आईपी पता नहीं मिला है, तो खाली स्ट्रिंग लौटा दी जाती है।गो

func parseIp(checkIpBody string) string { 
    reg, err := regexp.Compile("[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") 
    if err == nil { 
     return "" 
    } 
    return reg.FindString(checkIpBody) 
} 

संकलन समय त्रुटि मैं हो रही है

अज्ञात भागने अनुक्रम है:।

मैं कैसे कह सकता हूं कि '.' वास्तविक चरित्र है जिसे मैं ढूंढ रहा हूं? मैंने सोचा कि यह भागने से चाल चलती है, लेकिन स्पष्ट रूप से मैं गलत हूं।

उत्तर

63

\ बैकस्लैश रेगेक्स पार्सर द्वारा व्याख्या नहीं किया जा रहा है, इसका अर्थ स्ट्रिंग अक्षर में व्याख्या किया जा रहा है। आप बैकस्लैश फिर से बच चाहिए:

regexp.Compile("[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+") 

एक स्ट्रिंग " दोहरे-उद्धरण पात्रों के साथ उद्धृत एक "व्याख्या शाब्दिक स्ट्रिंग" जाओ के रूप में जाना जाता है। व्याख्या की गई स्ट्रिंग अक्षर अधिकांश भाषाओं में स्ट्रिंग अक्षर की तरह हैं: \ बैकस्लैश वर्णों को शाब्दिक रूप से शामिल नहीं किया गया है, उनका उपयोग अगले चरित्र को विशेष अर्थ देने के लिए किया जाता है। पार्स किए गए मान में एक बैकस्लैश वर्ण प्राप्त करने के लिए स्रोत को \\ पंक्ति में दो बैकस्लैश शामिल होना चाहिए।

Evan Shaw pointed out in the comments के रूप में, गो का एक और विकल्प है जो नियमित अभिव्यक्तियों के लिए स्ट्रिंग अक्षर लिखते समय उपयोगी हो सकता है। एक "कच्ची स्ट्रिंग अक्षर" को ` बैकटिक वर्णों द्वारा उद्धृत किया गया है। वहाँ एक कच्चे स्ट्रिंग शाब्दिक में कोई भी विशेष वर्ण है, इसलिए जब तक अपने पैटर्न एक बैकटिक आप कुछ भी भागने के बिना इस वाक्य विन्यास का उपयोग कर सकते हैं शामिल नहीं है के रूप में कर रहे हैं:

regexp.Compile(`[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+`) 

यह the "String literals" section of the Go spec में वर्णित है।

+1

बहुत धन्यवाद, और महान समय! – Nate

+24

वैकल्पिक रूप से, आप डबल बैकस्लाश से बचने के लिए एक अनियंत्रित स्ट्रिंग का उपयोग कर सकते हैं: 'regexp.Compile (\' [0-9] + \। [0-9] + \। [0-9] + \। [0-9 ] + \ ')' –

+2

@ ईवन, महान टिप। एक नई भाषा सीखना ... – Nate

1

IPv4 पता (सटीक कब्जा)

से मेल खाता है इस regex 0.0.0.0 255.255.255.255

के माध्यम से

उपयोग accurracy के साथ आईपी संख्या मैच के लिए।

प्रत्येक 4 संख्याओं को कैप्चरिंग समूह में संग्रहीत किया जाता है, ताकि आप उन्हें आगे की प्रक्रिया के लिए एक्सेस कर सकें।

"(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])" 
+0

अच्छा गहराई से regex। धन्यवाद। – Nate

+1

रेगेक्स की जटिलता को ध्यान में रखते हुए मैं शायद स्ट्रिंग को पूर्णांक में परिवर्तित करना और इसके बजाय उस तरीके की जांच करना चुनूंगा। अब से एक साल मुझे संदेह है कि मुझे उस अभिव्यक्ति का विवरण बहुत अच्छी तरह याद आएगा। उस तरह के कोड ने मुझे पहले काट दिया है। जाओ पुस्तकालयों को उस तरह के चेक के लिए भी समर्थन हो सकता है ... अभी के लिए मैं बस सर्वर से भेजे गए स्ट्रिंग पर भरोसा कर रहा हूं जब तक कि यह 4 बाइट्स डॉट्स ("।") से अलग हो। – Nate

+0

इसे पढ़ने में आसान बनाने के लिए, मैं आमतौर पर करता हूं: 'numBlock =" (25 [0-5] | 2 [0-4] [0-9] | 1 [0-9] [0-9] | [1-9]? [0-9]) " regexPattern = numBlock +" \\। " + numBlock + "\\।" + numBlock + "\\।" + numBlock ' – Nashenas