নিয়মিত এক্সপ্রেশন ব্যবহার করে রুবিতে একটি স্ট্রিং থেকে একটি স্ট্রিং আঁকুন


130

আমি রুবীর স্ট্রিংয়ের মধ্য থেকে কীভাবে একটি স্ট্রিংস বের করতে পারি?

উদাহরণ:

String1 = "<name> <substring>"

আমি বের করে আনতে চান substringথেকে String1(শেষ সংঘটন মধ্যে অর্থাত সবকিছু <এবং >)।

উত্তর:


134
String1.scan(/<([^>]*)>/).last.first

scanএকটি অ্যারের যা প্রত্যেকের জন্য সৃষ্টি <item>মধ্যে String1পাঠ্য ধারণ করে <এবং >(কারণ যখন একটি Regex ক্যাপচার গ্রুপ সম্বলিত ব্যবহৃত, স্ক্যান প্রতিটি ম্যাচের জন্য যেমনটি ধারণকারী একটি অ্যারের সৃষ্টি) এক উপাদান অ্যারের মধ্যে। lastআপনাকে সেই অ্যারেগুলির মধ্যে সর্বশেষটি firstদেয় এবং তারপরে আপনাকে এতে স্ট্রিং দেয়।


319
"<name> <substring>"[/.*<([^>]*)/,1]
=> "substring"

ব্যবহারের দরকার নেই scan, যদি আমাদের কেবল একটি ফলাফল প্রয়োজন।
আমাদের matchযখন রুবির আছে তখন পাইথন ব্যবহার করার দরকার নেই String[regexp,#]

দেখুন: http://ruby-doc.org/core/String.html#method-i-5B-5D

বিঃদ্রঃ: str[regexp, capture] → new_str or nil


37
অন্যান্য নিখুঁতভাবে বৈধ (এবং আমি কী আরও পড়তে পারা যায়) সমাধানগুলিকে কুখ্যাত করার দরকার নেই।
কোরিয়ারওয়ার্ড

41
@ চল্লিশ, যদি তারা আরও ভাল হয় তবে দয়া করে যুক্তি দিন। উদাহরণস্বরূপ, sepp2k এর সমাধানটি আরও নমনীয় এবং সে কারণেই আমি if we need only one resultআমার সমাধানটিতে ইঙ্গিত করেছি। এবং match()[]ধীর, কারণ এটি একের পরিবর্তে দুটি পদ্ধতি।
নাকিলন

4
উপস্থাপিত সমস্ত পদ্ধতিগুলির মধ্যে এটি দ্রুততম, তবে এমনকি ধীরতম পদ্ধতিটি আমার মেশিনে কেবলমাত্র 4.5 মাইক্রোসেকেন্ড নেয়। কেন এই পদ্ধতিটি দ্রুত হয় তা অনুমান করার জন্য আমার কোন যত্ন নেই। পারফরম্যান্সে, জল্পনা ব্যর্থ । শুধুমাত্র পরিমাপ গণনা।
ওয়েইন কনরাড

8
আমি এই সমাধানটিকে আরও সোজাসাপ্টা এবং বিন্দুতে খুঁজে পাই (যেহেতু আমি রুবির কাছে নতুন)। ধন্যবাদ।
রায়ান এইচ।

কোনও পণ্য এবং দলের সামগ্রিক সাফল্য বিবেচনা করার সময় @ নাকিলন পঠনযোগ্যতা ক্ষুদ্র পারফরম্যান্সের পার্থক্যকে ছাড়িয়ে যেতে পারে, তাই কোরিওয়ার্ড একটি বৈধ মন্তব্য করেছিলেন। এটি বলেছিল, আমি মনে করি string[regex]এই পরিস্থিতিতে ঠিক ততটাই পাঠযোগ্য হতে পারে, তাই আমি ব্যক্তিগতভাবে এটি ব্যবহার করেছি।
নিক

24

আপনি এটির জন্য খুব সহজেই একটি নিয়মিত অভিব্যক্তি ব্যবহার করতে পারেন…

শব্দের চারদিকে ফাঁকা স্থান দেওয়া (তবে তা রাখছেন না):

str.match(/< ?([^>]+) ?>\Z/)[1]

বা স্থান ছাড়াই অনুমতি দেওয়া:

str.match(/<([^>]+)>\Z/)[1]

1
আমি নিশ্চিত নই যে সর্বশেষে <>স্ট্রিংয়ের শেষ জিনিসটি হওয়া দরকার। উদাহরণস্বরূপ যদি স্ট্রিংটির foo <bar> bazঅনুমতি দেওয়া হয় (এবং ফলাফল দেওয়ার কথা bar) তবে এটি কাজ করবে না।
sepp2k

আমি কেবল তার সরবরাহিত নমুনা স্ট্রিংয়ের উপর ভিত্তি করে চলেছি।
কোরিয়ারওয়ার্ড

10

পদ্ধতিটি ব্যবহার করে এখানে কিছুটা নমনীয় পদ্ধতির কথা বলা হয়েছে match। এটির সাহায্যে আপনি একাধিক স্ট্রিং উত্তোলন করতে পারেন:

s = "<ants> <pants>"
matchdata = s.match(/<([^>]*)> <([^>]*)>/)

# Use 'captures' to get an array of the captures
matchdata.captures   # ["ants","pants"]

# Or use raw indices
matchdata[0]   # whole regex match: "<ants> <pants>"
matchdata[1]   # first capture: "ants"
matchdata[2]   # second capture: "pants"

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