একটি রেজেক্সে স্ট্রিংকে ইন্টারপোল্ট করা


160

আমার রুবিতে আমার নিয়মিত প্রকাশের জন্য একটি স্ট্রিংয়ের মানটি প্রতিস্থাপন করতে হবে। এটি করার কোনও সহজ উপায় আছে? উদাহরণ স্বরূপ:

foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0" 
if goo =~ /value of foo here dynamically/
  puts "success!"
end

আপনি দেখতে চেষ্টা করছেন foo গু এর একটি স্ট্রিং কিনা? আপনি যা জিজ্ঞাসা করছেন এটি পরিষ্কার হয়েছে বলে আমি মনে করি না।
নিল

যদি তাই হয়, goo.includ? (Foo) যথেষ্ট!
গ্লেন এমসিডোনাল্ড

1
না, আমি foo গু-র একটি স্ট্রিং কিনা তা দেখার চেষ্টা করছিলাম না; আমার পাশাপাশি কিছু ক্যাপচারিংও করা দরকার, কাজেই এটি অন্তর্ভুক্ত নয়।
ক্রিস বাঞ্চ

উত্তর:



125

মনে রাখবেন যে, Regexp.quoteজন এল এর উত্তর গুরুত্বপূর্ণ!

if goo =~ /#{Regexp.quote(foo)}/

আপনি যদি কেবল "সুস্পষ্ট" সংস্করণটি করেন:

if goo =~ /#{foo}/

তারপরে আপনার ম্যাচের পাঠ্যের সময়সীমাগুলি রিজেক্সএক্স ওয়াইল্ডকার্ড হিসাবে বিবেচিত "0.0.0.0"হবে এবং মিলবে "0a0b0c0"

আরও মনে রাখবেন যে আপনি যদি সত্যিই কেবল একটি স্ট্রিং ম্যাচ পরীক্ষা করতে চান তবে আপনি কেবল এটি করতে পারেন

if goo.include?(foo)

যার জন্য অতিরিক্ত অক্ষরগুলির জন্য অতিরিক্ত উদ্ধৃতি বা উদ্বেগের প্রয়োজন নেই।


3
মনে রাখবেন যে .quote()আপনি যদি স্ট্রিংটি ব্যবহার করে একটি রেজেক্স তৈরি করতে চান তবে বিপরীতটি (ব্যবহার না করা )ও কার্যকর হতে পারে।
জেসি

"আপনি যদি সত্যিই কেবল একটি স্ট্রিং ম্যাচ পরীক্ষা করতে চান তবে আপনি if goo.include?(foo)অস্তিত্বের জন্য যাচাই করতে আগ্রহী যখন আপনি" => সত্য করতে পারেন । আপনি যদি স্ট্রিং.গ্র্যাশ প্রতিস্থাপন এবং ইতিমধ্যে ব্যবহার করতে আগ্রহী হন, তবে Regexp.quote আপনার একমাত্র বিকল্প হতে পারে।
আইজাক বেটেশ

যদি এমন কিছু ঘটে জেসি উপর যোগ করার জন্য এটা সুস্পষ্ট নয়, এর মানে হল শুধু অক্ষর আপনাকে পলান প্রয়োজন হবে না এর স্ট্রিং ক্ষণস্থায়ী Regexp.newবা Regexp.compile
dylankb

আমরা কেন Regexp.quote ব্যবহার করতে চাই এর দরকারী ব্যাখ্যার জন্য আপনাকে ধন্যবাদ
উইলিয়াম জড

7

সম্ভবত Regexp.escape(foo)একটি আদ্যস্থল হতে পারে, কিন্তু সেখানে একটি ভাল কারণ আপনি আরো প্রচলিত প্রকাশ-ক্ষেপক ব্যবহার করতে পারবেন না হল: "my stuff #{mysubstitutionvariable}"?

এছাড়াও, আপনি কেবল !goo.match(foo).nil?একটি আক্ষরিক স্ট্রিং দিয়ে ব্যবহার করতে পারেন ।




3

এখানে একটি সীমিত তবে দরকারী অন্যান্য উত্তর:

আমি আবিষ্কার করেছি যে আমি কেবলমাত্র আমার ইনপুট স্ট্রিংয়ে একক উদ্ধৃতি ব্যবহার করেছি: Regexp.quote বা Regexp.escape ব্যবহার না করে খুব সহজেই আমি একটি রেইগেক্সে sertোকাতে পারি: (একটি আইপি ঠিকানা মিল)

IP_REGEX = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'

my_str = "192.0.89.234 blahblah text 1.2, 1.4" # get the first ssh key 
# replace the ip, for demonstration
my_str.gsub!(/#{IP_REGEX}/,"192.0.2.0") 
puts my_str # "192.0.2.0 blahblah text 1.2, 1.4"

একক উদ্ধৃতি কেবল \\ এবং \ 'ব্যাখ্যা করে।

http://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes

এটি আমাকে সাহায্য করেছিল যখন আমাকে বহুবার রেইজেক্সের একই দীর্ঘ অংশটি ব্যবহার করার প্রয়োজন হয়েছিল। সর্বজনীন নয়, তবে প্রশ্নের উদাহরণের সাথে খাপ খায়, আমি বিশ্বাস করি।


আমি কৌতূহলী যে এখানে আমার পোস্ট সম্পর্কে কী ভাবা হবে তবে আমি সন্দেহ করি যে এটি এখন এখান থেকে খুব নীচে দেখা যাবে।
প্লাজমারব

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