পরিবর্তনীয় নাম ব্যবহার করে রুবি নিয়মিত প্রকাশ name


105

পরিবর্তনীয় নামের মূল্যের উপর ভিত্তি করে রুবিতে নিয়মিত প্রকাশের প্যাটার্ন তৈরি করা / ব্যবহার করা কি সম্ভব?

উদাহরণস্বরূপ, আমরা সবাই জানি যে আমরা রুবি স্ট্রিং দিয়ে নিম্নলিখিতটি করতে পারি:

str = "my string"
str2 = "This is #{str}" # => "This is my string"

আমি নিয়মিত প্রকাশের সাথে একই জিনিসটি করতে চাই:

var = "Value"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "a test foo"

স্পষ্টতই এটি তালিকাভুক্ত হিসাবে কাজ করে না, আমি কী করতে চাই তা দেখানোর জন্য এটি কেবল উদাহরণ হিসাবে রেখেছি। আমার একটি ভেরিয়েবলের সামগ্রীর মানের ভিত্তিতে রিজেক্সপ ম্যাচ করা দরকার।

উত্তর:


184

আপনার মনে হয় যে কোডটি কাজ করে না, তা করে:

var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' )   # => "a test foo"

বিষয়গুলিতে নিয়মিত প্রকাশের মেটা-অক্ষর থাকতে পারে তবে জিনিসগুলি আরও আকর্ষণীয় হয়ে উঠবে। যদি এটি হয় এবং আপনি চান যে এই ম্যাটাচ্যাকাররা সাধারণত নিয়মিত প্রকাশে যা করেন তা করা উচিত, তবে একই জিএসব কাজ করবে:

var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"

তবে, যদি আপনার অনুসন্ধানের স্ট্রিংয়ে মেটাচার্যাক্টর থাকে এবং আপনি এগুলি মেটাচার্যাকার হিসাবে ব্যাখ্যা করতে চান না , তবে রিজেএক্সএক্স.সেসকেপটি এটি ব্যবহার করুন:

var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"

বা কেবল নিয়মিত এক্সপ্রেশনের পরিবর্তে gsub কে স্ট্রিং দিন। এমআরআই> = 1.8.7 এ, gsub একটি স্ট্রিং প্রতিস্থাপন যুক্তিটিকে একটি নিয়মিত প্রকাশ হিসাবে নয়, সরল স্ট্রিং হিসাবে বিবেচনা করবে:

var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"

(এটি ব্যবহৃত হত যে gsub- এ স্ট্রিং প্রতিস্থাপনের যুক্তিটি স্বয়ংক্রিয়ভাবে একটি নিয়মিত অভিব্যক্তিতে রূপান্তরিত হয়েছিল I আমি জানি যে এটি ছিল 1.6 সালে।

অন্যান্য উত্তরে উল্লিখিত হিসাবে, আপনি দ্রবীভূতকরণের বিকল্প হিসাবে Regexp.new ব্যবহার করতে পারেন:

var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"

4
Regexp.escape এর ইঙ্গিতটি হ'ল যা আমি জানতাম না আমার প্রয়োজন। ধন্যবাদ!
জেফ প্যাকেট

regxPlayerVariable = '(। *?) =। *? ডকুমেন্ট get .getElementById (# {প্লাগইনপ্লেভেরিয়েবল})' আমি উপরের সমস্ত প্রয়োগ করেছি কিন্তু এগুলি কার্যকর হয় না।
এসএসপি

1
@ এসএসপি সমস্যাটি আলাদা প্রশ্নে ব্যাখ্যা করা ভাল might
ওয়েইন কনরাড

13

এটি কাজ করে, তবে আপনাকে gsub!অন্য পরিবর্তনশীলটিকে রিটার্নটি ব্যবহার বা নির্ধারণ করতে হবে

var = "Value"
str = "a test Value"
str.gsub!( /#{var}/, 'foo' )  # Or this: new_str = str.gsub( /#{var}/, 'foo' )
puts str


6

আপনি রুবিতে ভেরিয়েবলের মাধ্যমে নিয়মিত এক্সপ্রেশন ব্যবহার করতে পারেন:

var = /Value/
str = "a test Value"
str.gsub( /#{var}/, 'foo' )

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

আমি মনে করি gsub- এ স্ল্যাশগুলির বিন্দুটি দেখাতে হয়েছিল যে একটি রেজেক্সে একটি ভেরিয়েবল থাকতে পারে যা নিজেই একটি রেজেেক্স। ভেরিয়েবলটি স্ট্রিং টাইপের হতে হবে না (এবং বাস্তবে ওয়েইনের উত্তরে বর্ণিত কারণগুলির জন্য রেজেক্স আরও ভাল)।
মাহেমফ

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