Go-তে রেগুলার এক্সপ্রেশনের জন্য regexp প্যাকেজটি সহায়তা প্রদান করে।
গৃহীত রেগুলার এক্সপ্রেশনের সিনট্যাক্স Perl, Python এবং অন্যান্য ভাষায় ব্যবহৃত সাধারণ সিনট্যাক্সের মতোই।
সার্চ প্যাটার্ন এবং ইনপুট টেক্সট দুটোই UTF-8 হিসেবে ব্যাখ্যা করা হয়।
স্ট্রিং তৈরির জন্য ব্যাকটিক (`) ব্যবহার করলে, ব্যাকস্ল্যাশ (\) এর কোনো বিশেষ অর্থ থাকে না এবং ট্যাব \t বা নিউলাইন \n-এর মতো বিশেষ অক্ষরের সূচনা চিহ্নিত করে না:
"\t\n" // regular string literal with 2 characters: a tab and a newline
`\t\n`// raw string literal with 4 characters: two backslashes, a 't', and an 'n'
এ কারণে, রেগুলার এক্সপ্রেশন তৈরির জন্য ব্যাকটিক ব্যবহার করা বাঞ্ছনীয়, কারণ এতে আমাদের ব্যাকস্ল্যাশ এস্কেপ করতে হয় না:
"\\" // string with a single backslash
`\\` // string with 2 backslashes
RegExp টাইপএকটি রেগুলার এক্সপ্রেশন ব্যবহার করতে হলে প্রথমে আমাদের স্ট্রিং প্যাটার্নটি কম্পাইল করতে হয়।
এখানে কম্পাইল করা মানে হলো রেগুলার এক্সপ্রেশনের স্ট্রিং প্যাটার্নটি নিয়ে সেটিকে এমন একটি অভ্যন্তরীণ রূপে রূপান্তর করা যা নিয়ে কাজ করা সহজ।
আমাদের প্রতিটি প্যাটার্ন কেবল একবারই কম্পাইল করতে হয়, এরপর আমরা রেগুলার এক্সপ্রেশনের কম্পাইল করা সংস্করণটি বহুবার ব্যবহার করতে পারি।
regexp.Regexp টাইপটি একটি কম্পাইল করা রেগুলার এক্সপ্রেশনকে বোঝায়।
আমরা regexp.Compile ফাংশন দিয়ে একটি স্ট্রিং প্যাটার্ন কম্পাইল করে regexp.Regexp পেতে পারি।
কম্পাইলেশন ব্যর্থ হলে এই ফাংশনটি nil এবং একটি এরর রিটার্ন করে:
re, err := regexp.Compile(`(a|b)+`)
fmt.Println(re, err) // => (a|b)+ <nil>
re, err = regexp.Compile(`a|b)+`)
fmt.Println(re, err) // => <nil> error parsing regexp: unexpected ): `a|b)+`
MustCompile ফাংশনটি Compile ফাংশনের একটি সুবিধাজনক বিকল্প:
re = regexp.MustCompile(`[a-z]+\d*`)
এই ফাংশন ব্যবহার করলে এরর হ্যান্ডেল করার প্রয়োজন নেই।
MustCompile কেবল তখনই ব্যবহার করা উচিত যখন আমরা নিশ্চিত যে প্যাটার্নটি কম্পাইল হয়, কারণ অন্যথায় প্রোগ্রামটি প্যানিক করবে।
Regexp-এর ১৬টি মেথড আছে যেগুলো একটি রেগুলার এক্সপ্রেশনের সাথে মিল খুঁজে মিলে যাওয়া টেক্সট শনাক্ত করে।
এদের নাম এই রেগুলার এক্সপ্রেশন দ্বারা মিলানো হয়:
Find(All)?(String)?(Submatch)?(Index)?
All থাকে, তাহলে রুটিনটি সম্পূর্ণ এক্সপ্রেশনের ধারাবাহিক অ-ওভারল্যাপিং মিলগুলো খুঁজে বের করে।String থাকে, তাহলে আর্গুমেন্টটি একটি স্ট্রিং; অন্যথায় এটি বাইটের একটি স্লাইস; রিটার্ন ভ্যালুগুলো উপযুক্তভাবে সমন্বয় করা হয়।Submatch থাকে, তাহলে রিটার্ন ভ্যালুটি একটি স্লাইস যা এক্সপ্রেশনের ধারাবাহিক সাবম্যাচগুলো শনাক্ত করে।Index থাকে, তাহলে ইনপুট স্ট্রিংয়ের মধ্যে বাইট ইনডেক্স জোড়া দিয়ে মিল ও সাবম্যাচ শনাক্ত করা হয়।এছাড়াও কিছু মেথড আছে:
সব মিলিয়ে, regexp প্যাকেজটি ৪০টিরও বেশি ফাংশন ও মেথড ডিফাইন করে।
নিচে আমরা কয়েকটি মেথডের ব্যবহার দেখাব।
এই এবং অন্যান্য ফাংশনের বিস্তারিত জানতে অনুগ্রহ করে API ডকুমেন্টেশন দেখুন।
MatchString উদাহরণMatchString মেথডটি রিপোর্ট করে যে একটি স্ট্রিংয়ে রেগুলার এক্সপ্রেশনের কোনো মিল আছে কি না।
re = regexp.MustCompile(`[a-z]+\d*`)
b = re.MatchString("[a12]") // => true
b = re.MatchString("12abc34(ef)") // => true
b = re.MatchString(" abc!") // => true
b = re.MatchString("123 456") // => false
FindString উদাহরণFindString মেথডটি রেগুলার এক্সপ্রেশনের সবচেয়ে বামের মিলের টেক্সট ধারণ করা একটি স্ট্রিং রিটার্ন করে।
re = regexp.MustCompile(`[a-z]+\d*`)
s = re.FindString("[a12]") // => "a12"
s = re.FindString("12abc34(ef)") // => "abc34"
s = re.FindString(" abc!") // => "abc"
s = re.FindString("123 456") // => ""
FindStringSubmatch উদাহরণFindStringSubmatch মেথডটি রেগুলার এক্সপ্রেশনের সবচেয়ে বামের মিল এবং তার সাবএক্সপ্রেশনগুলোর মিল (যদি থাকে) ধারণ করা স্ট্রিংয়ের একটি স্লাইস রিটার্ন করে।
এটি ক্যাপচারিং গ্রুপের সাথে মিলে যাওয়া স্ট্রিংগুলো শনাক্ত করতে ব্যবহার করা যায়।
nil রিটার্ন ভ্যালু বোঝায় কোনো মিল নেই।
re = regexp.MustCompile(`[a-z]+(\d*)`)
sl = re.FindStringSubmatch("[a12]") // => []string{"a12","12"}
sl = re.FindStringSubmatch("12abc34(ef)") // => []string{"abc34","34"}
sl = re.FindStringSubmatch(" abc!") // => []string{"abc",""}
sl = re.FindStringSubmatch("123 456") // => <nil>
ReplaceAllString উদাহরণre.ReplaceAllString(src,repl) মেথডটি src-এর একটি কপি রিটার্ন করে, যেখানে রেগুলার এক্সপ্রেশন re-এর মিলগুলোকে রিপ্লেসমেন্ট স্ট্রিং repl দিয়ে প্রতিস্থাপন করা হয়।
re = regexp.MustCompile(`[a-z]+\d*`)
s = re.ReplaceAllString("[a12]", "X") // => "[X]"
s = re.ReplaceAllString("12abc34(ef)", "X") // => "12X(X)"
s = re.ReplaceAllString(" abc!", "X") // => " X!"
s = re.ReplaceAllString("123 456", "X") // => "123 456"
Split উদাহরণre.Split(s,n) মেথডটি একটি টেক্সট s-কে এক্সপ্রেশন দ্বারা বিভক্ত সাবস্ট্রিংয়ে ভাগ করে এবং সেই এক্সপ্রেশন মিলগুলোর মধ্যবর্তী সাবস্ট্রিংয়ের একটি স্লাইস রিটার্ন করে।
n সংখ্যাটি সর্বোচ্চ কতটি সাবস্ট্রিং রিটার্ন হবে তা নির্ধারণ করে।
যদি n<0 হয়, মেথডটি সব সাবস্ট্রিং রিটার্ন করে।
re = regexp.MustCompile(`[a-z]+\d*`)
sl = re.Split("[a12]", -1) // => []string{"[","]"}
sl = re.Split("12abc34(ef)", 2) // => []string{"12","(ef)"}
sl = re.Split(" abc!", -1) // => []string{" ","!"}
sl = re.Split("123 456", -1) // => []string{"123 456"}
এই প্যাকেজ যে রেগুলার এক্সপ্রেশন ইমপ্লিমেন্টেশন দেয়, সেটি ইনপুটের আকারের সাথে রৈখিক সময়ে চলবে বলে নিশ্চয়তা দেওয়া হয়েছে।
regexp প্যাকেজটি RE2 রেগুলার এক্সপ্রেশন ইমপ্লিমেন্ট করে (\C বাদে)।
এর সিনট্যাক্স PCRE (পার্ল-সামঞ্জস্যপূর্ণ রেগুলার এক্সপ্রেশন)-এর সাথে বেশ সামঞ্জস্যপূর্ণ, তবে কিছু পার্থক্য আছে।
বিস্তারিত জানতে অনুগ্রহ করে এই আর্টিকেলের "Caveat section" দেখুন।