রুবিতে নিয়মিত প্রকাশের প্রতিটি মিল খুঁজে পাওয়ার কী দ্রুত উপায় আছে? আমি রুবি এসটিএলে রেজেক্স বস্তুটি দেখেছি এবং গুগলে অনুসন্ধান করেছি কোনও লাভ হয়নি।
রুবিতে নিয়মিত প্রকাশের প্রতিটি মিল খুঁজে পাওয়ার কী দ্রুত উপায় আছে? আমি রুবি এসটিএলে রেজেক্স বস্তুটি দেখেছি এবং গুগলে অনুসন্ধান করেছি কোনও লাভ হয়নি।
উত্তর:
ব্যবহারের scan
কৌশলটি করা উচিত:
string.scan(/regex/)
/(?=(...))/
।
সমস্ত মিলে যাওয়া স্ট্রিংগুলি সন্ধান করতে স্ট্রিংয়ের scan
পদ্ধতিটি ব্যবহার করুন ।
str = "A 54mpl3 string w1th 7 numb3rs scatter36 ar0und"
str.scan(/\d+/)
#=> ["54", "3", "1", "7", "3", "36", "0"]
আপনি যদি চান তবে MatchData
যা রেজেপেক্স match
পদ্ধতিতে প্রত্যাবর্তিত অবজেক্টের ধরণ, এটি ব্যবহার করুন:
str.to_enum(:scan, /\d+/).map { Regexp.last_match }
#=> [#<MatchData "54">, #<MatchData "3">, #<MatchData "1">, #<MatchData "7">, #<MatchData "3">, #<MatchData "36">, #<MatchData "0">]
ব্যবহারের সুবিধা MatchData
হ'ল আপনি এই জাতীয় পদ্ধতি ব্যবহার করতে পারেন offset
:
match_datas = str.to_enum(:scan, /\d+/).map { Regexp.last_match }
match_datas[0].offset(0)
#=> [2, 4]
match_datas[1].offset(0)
#=> [7, 8]
আপনি আরও জানতে চাইলে এই প্রশ্নগুলি দেখুন:
বিশেষ ভেরিয়েবল সম্পর্কে পড়া $&
, $'
, $1
, $2
রুবি সহায়ক বলে প্রমাণিত হবে।
আপনার যদি গ্রুপগুলির সাথে একটি রেজিপ্স থাকে:
str="A 54mpl3 string w1th 7 numbers scatter3r ar0und"
re=/(\d+)[m-t]/
scan
মিলে যাওয়া গ্রুপগুলি খুঁজতে আপনি স্ট্রিংয়ের পদ্ধতিটি ব্যবহার করতে পারেন :
str.scan re
#> [["54"], ["1"], ["3"]]
মিলের প্যাটার্নটি সন্ধান করতে:
str.to_enum(:scan,re).map {$&}
#> ["54m", "1t", "3r"]
str.scan(/\d+[m-t]/) # => ["54m", "1t", "3r"]
str.to_enum(:scan,re).map {$&}
/(\d+)[m-t]/
না /\d+[m-t]/
লিখতে: re = /(\d+)[m-t]/; str.scan(re)
একই str.scan(/(\d+)[mt]/)
কিন্তু আমি # যাক> [["" 54 "], [" 1 "], [" 3 "]]
এবং "54m", "1t", "3r"]
প্রশ্ন ছিল: যদি আমি একটি দলের সঙ্গে একটি রেগুলার এক্সপ্রেশন আছে এবং নিয়মিত পরিবর্তন না করে সমস্ত নিদর্শন ক্যাপচার করতে চান এক্সপ্রেশন (গ্রুপ ছেড়ে), আমি কীভাবে এটি করতে পারি? এই অর্থে, একটি সম্ভাব্য সমাধান, যদিও কিছুটা রহস্যজনক এবং পড়তে অসুবিধা ছিল, তা ছিল:str.to_enum(:scan,re).map {$&}
আপনি ব্যবহার করতে পারেন string.scan(your_regex).flatten
। যদি আপনার রেজেক্সে গোষ্ঠী থাকে তবে এটি একটি একক সরল অ্যারেতে ফিরে আসবে।
string = "A 54mpl3 string w1th 7 numbers scatter3r ar0und"
your_regex = /(\d+)[m-t]/
string.scan(your_regex).flatten
=> ["54", "1", "3"]
Regex পাশাপাশি একটি নামী গ্রুপ হতে পারে।
string = 'group_photo.jpg'
regex = /\A(?<name>.*)\.(?<ext>.*)\z/
string.scan(regex).flatten
আপনি gsub
ম্যাচটাটা চাইলে এটি আরও একটি উপায়ে ব্যবহার করতে পারেন।
str.gsub(/\d/).map{ Regexp.last_match }
your_regex = /(\d+)[m-t]/
এবং আপনার ব্যবহারের প্রয়োজন হবে না flatten
। আপনার চূড়ান্ত উদাহরণটি ব্যবহার করে last_match
যা সম্ভবত এটি নিরাপদ তবে এটি একটি বিশ্বব্যাপী এবং সম্ভবত কল করার আগে কোনও রেজেক্স ম্যাচ করা থাকলে ওভাররাইট করা যেতে পারে last_match
। পরিবর্তে এটি প্যাটার্ন এবং প্রয়োজনীয়তার উপর নির্ভর করে সম্ভবত ব্যবহার করা নিরাপদ string.match(regex).captures # => ["group_photo", "jpg"]
বা string.scan(/\d+/) # => ["54", "3", "1", "7", "3", "0"]
অন্যান্য উত্তরে যেমন দেখানো হয়েছে।