রুবি রেজেক্সের প্রথম ম্যাচটি ফিরুন


97

আমি রুবিতে একটি স্ট্রিংয়ের উপর একটি রেজেক্স ম্যাচ সম্পাদন করার উপায় খুঁজছি এবং এটি প্রথম ম্যাচে শর্ট সার্কিটের জন্য রয়েছে।

আমি যে স্ট্রিংটি প্রক্রিয়াকরণ করছি তা দীর্ঘ এবং এটি স্ট্যান্ডার্ড উপায় ( matchপদ্ধতি) এর মতো দেখতে পুরো জিনিসটি প্রক্রিয়া করবে, প্রতিটি ম্যাচ সংগ্রহ করবে এবং সমস্ত ম্যাচযুক্ত ম্যাচডাটা অবজেক্টটি ফিরিয়ে দেবে।

match = string.match(/regex/)[0].to_s

উত্তর:


136

আপনি চেষ্টা করতে পারেন variableName[/regular expression/]। এটি আইআরবি থেকে একটি উদাহরণ আউটপুট:

irb(main):003:0> names = "erik kalle johan anders erik kalle johan anders"
=> "erik kalle johan anders erik kalle johan anders"
irb(main):004:0> names[/kalle/]
=> "kalle"

এটি কি কোনও ম্যাচ করছে না এবং পর্দার আড়ালে প্রথম ফলাফলটি ফিরে আসছে?
গিশু

7
বিভিন্ন দৈর্ঘ্যের স্ট্রিংগুলির সাথে কিছুটা বেঞ্চমার্কিংয়ের পরে এবং সি উত্সের দিকে তাকানোর পরে এটি দেখা যায় যে রেজেক্স.ম্যাচ শর্ট সার্কিট করে এবং কেবল প্রথম ম্যাচটি খুঁজে পায়।
ড্যানিয়েল বিয়ার্ডস্লি

4
ঝরঝরে, এই শর্টকাট সম্পর্কে জানতাম না।
পিয়ের

এই শর্টকাটে কিছু ডকুমেন্টেশন আছে? অপেক্ষাকৃত সহজ কাজ বলে আমি যা চেয়েছিলাম তার জন্য আমি উচ্চ এবং নিম্ন সন্ধান করেছি এবং এটি সন্ধানের পরে কেবল আমার সমস্যা সমাধান করেছি। ধন্যবাদ!
dmourat

4
@dmourati আপনি স্ট্রিং # [] তে নথিভুক্ত এই বৈশিষ্ট্যটি পেতে পারেন । ডকটি সম্পর্কে জিজ্ঞাসা করার জন্য ধন্যবাদ, কারণ এটি পড়ার সাথে আমি captureযুক্তিটি খুঁজে পেয়েছি - যা আপনাকে পুরো ম্যাচের পরিবর্তে একটি ক্যাপচার ফিরিয়ে দেয়।
slothbear

70

আপনি ব্যবহার করতে পারেন []: (যা মত match)

"foo+account2@gmail.com"[/\+([^@]+)/, 1] # matches capture group 1, i.e. what is inside ()
# => "account2"
"foo+account2@gmail.com"[/\+([^@]+)/]    # matches capture group 0, i.e. the whole match
# => "+account2"

4
সেরা সম্পূর্ণ উত্তর
akostadinov

23

যদি কোনও ম্যাচের অস্তিত্বই গুরুত্বপূর্ণ হয় তবে আপনি যেতে পারেন

/regexp/ =~ "string"

যে কোনও উপায়ে, matchকেবল প্রথম হিটটি ফেরত দেওয়া উচিত, যখন scanপুরো স্ট্রিং জুড়ে অনুসন্ধান করা হয়। সুতরাং যদি

matchData = "string string".match(/string/)
matchData[0]    # => "string"
matchData[1]    # => nil - it's the first capture group not a second match

9

এই বৈশিষ্ট্যটি দুর্দান্ত বা পুরোপুরি উন্মাদ কিনা তা আমি এখনও নিশ্চিত নই, তবে আপনার রেজেক্স স্থানীয় ভেরিয়েবলগুলি সংজ্ঞায়িত করতে পারে।

/\$(?<dollars>\d+)\.(?<cents>\d+)/ =~ "$3.67" #=> 0
dollars #=> "3"

( Http://ruby-doc.org/core-2.1.1/Regexp.html থেকে নেওয়া )।


দুর্দান্ত বৈশিষ্ট্য! আমার যা প্রয়োজন কেবল তা হল
রাফােক্সেক্স

ক্যাভ্যাট: এটি কেবল তখনই কাজ করে যখন regex =~ string", not when স্ট্রিং = ge রেজেক্স`
ক্রিস্টোফার ওজেব্যাক

2

একটি নিয়মিত এক্সপ্রেশন (রেজেক্স) একটি সসীম রাষ্ট্র মেশিন (এফএসএম) ছাড়া কিছুই নয়।

একটি এফএসএম প্রশ্নের উত্তর দেওয়ার চেষ্টা করে "এই রাষ্ট্র কি সম্ভব?"

কোনও ম্যাচ না পাওয়া (সাফল্য) না পাওয়া বা সমস্ত পাথ অন্বেষণ না করা এবং কোনও মিল খুঁজে পাওয়া না যাওয়া (ব্যর্থতা) হওয়া পর্যন্ত এটি প্যাটার্ন ম্যাচ করার চেষ্টা চালিয়ে যায়।

সাফল্যে, প্রশ্ন "এই রাষ্ট্র কি সম্ভব?" একটি "হ্যাঁ" দিয়ে উত্তর দেওয়া হয়েছে। অতএব আর কোনও মিলের প্রয়োজন নেই এবং রেজেক্স ফিরে আসে।

দেখুন এই এবং এই এই সম্পর্কে আরো জানার জন্য।

আরও: রেজেক্স কীভাবে কাজ করে তা প্রদর্শনের জন্য এখানে একটি আকর্ষণীয় উদাহরণ । এখানে, একটি রেজেক্স ব্যবহারের জন্য একটি প্রদত্ত সংখ্যাটি প্রধান কিনা তা সনাক্ত করতে ব্যবহৃত হয়। এই উদাহরণটি পার্লতে রয়েছে তবে এটি রুবিতেও লেখা যেতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.