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


121

রুবিতে এটি অনুবাদ করতে আমার সমস্যা হচ্ছে।

এখানে জাভাস্ক্রিপ্টের একটি অংশ রয়েছে যা আমি যা করতে চাই ঠিক তা করে:

function get_code(str){
    return str.replace(/^(Z_.*): .*/,"$1")​​​​​​​​​​​​​​​​​​​​​​​​​​​;
}

আমি gsub , sub , এবং প্রতিস্থাপন চেষ্টা করেছি তবে কিছুই আমি প্রত্যাশা করছি না বলে মনে হয়।

আমি চেষ্টা করেছি এমন জিনিসগুলির উদাহরণ এখানে:

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/) { |capture| capture }
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "$1")
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "#{$1}")
"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\1")
"Z_sdsd: sdsd".gsub(/(.).*/) { |capture| capture }

আপনি যা চেষ্টা করেছেন তার জন্য আপনার আসল কোডটি প্রদর্শন করা উচিত।
অ্যাম্বার

@ আম্বর আমি নমুনা রেখেছি আমি চেষ্টা করেছি।
জেডি আইজ্যাকস

উত্তর:


192

'\1'প্রতিস্থাপনের জন্য চেষ্টা করুন ( একক উদ্ধৃতিগুলি গুরুত্বপূর্ণ, অন্যথায় আপনাকে এড়াতে হবে \):

"foo".gsub(/(o+)/, '\1\1\1')
#=> "foooooo"

তবে যেহেতু আপনি কেবল ক্যাপচার গ্রুপে আগ্রহী বলে মনে করছেন, তাই মনে রাখবেন যে আপনি একটি রেজেক্সের সাথে একটি স্ট্রিং সূচক করতে পারেন:

"foo"[/oo/]
#=> "oo"
"Z_123: foobar"[/^Z_.*(?=:)/]
#=> "Z_123"

68
মনে রাখবেন যে প্রতিস্থাপনের স্ট্রিংটি একক উদ্ধৃতিগুলির মধ্যে থাকলে কেবল এটিই কাজ করে । আমি 5 মিনিট নষ্ট করেছিলাম তা আবিষ্কার করে।
ভিকি চিজওয়ানি

7
@ মার্কথোমাস - প্রায়শই বার আমরা পুরো সম্পূর্ণ উত্তর না পড়ে প্রথমে শীর্ষ / স্বীকৃত উত্তর চেষ্টা করি। এটি সাধারণত কোনও সমস্যার সমাধানের সবচেয়ে কার্যকর উপায় বলে মনে হয়। ভিকিকে বিরতি দিন! :)
জোশ এম

@ ভিকিচিজওয়ানি ভাল মন্তব্য করেছেন, তবে এটিও নোট করুন যে রুবি ইনলাইন ব্যবহার করে (কমান্ড লাইনে -e) ডাবল উক্তিগুলি দেখা যায় বেশি : printf "Punkinhead the name" | ruby -ne 'puts gsub /.*(the name)/, "Jonathans \\1"'কারণ প্রদত্ত এক্সপ্রেশনটি -eসাধারণত একক উদ্ধৃতিতে আবৃত থাকে।
জোনাথন কোমার

স্ট্রিংয়ের প্যাটার্নের সমস্ত ঘটনার জন্য এটি কীভাবে করবেন?
জগদীপ সিং

1
@ জগদীপসিংহ, এটি ডিফল্টরূপে সমস্ত উপস্থিতি প্রতিস্থাপন করে।
Iulian Onofrei

36

\1ডাবল উদ্ধৃতি এড়ানো প্রয়োজন। সুতরাং আপনি হয় চান

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1")

অথবা

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, '\1')

gsub এ থাকা দস্তাবেজগুলি দেখুন যেখানে এটি বলেছে "এটি যদি একটি দ্বিগুণ-উদ্ধৃত স্ট্রিং হয় তবে দুটি ব্যাক-রেফারেন্স অবশ্যই অতিরিক্ত ব্যাকস্ল্যাশের আগে হওয়া উচিত।"

বলা হচ্ছে, যদি আপনি কেবল ম্যাচের ফলাফল চান তবে আপনি করতে পারেন:

"Z_sdsd: sdsd".scan(/^Z_.*(?=:)/)

অথবা

"Z_sdsd: sdsd"[/^Z_.*(?=:)/]

নোট করুন যে এটি (?=:)একটি নন-ক্যাপচারিং গ্রুপ যাতে :আপনার ম্যাচে প্রদর্শিত না হয়।



5

কিছু ফলাফল ফিল্টার করার জন্য আপনার যদি একটি রেজেেক্স ব্যবহার করতে হয় এবং কেবল ক্যাপচার গ্রুপ ব্যবহার করেন তবে আপনি নিম্নলিখিতটি করতে পারেন:

str = "Leesburg, Virginia  20176"
state_regex = Regexp.new(/,\s*([A-Za-z]{2,})\s*\d{5,}/)
# looks for the comma, possible whitespace, captures alpha,
# looks for possible whitespace, looks for zip

> str[state_regex]
=> ", Virginia  20176"

> str[state_regex, 1] # use the capture group
=> "Virginia"


0

$ ভেরিয়েবলগুলি কেবলমাত্র ব্লকে ম্যাচগুলিতে সেট করা হয়:

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/) { "#{ $1.strip }" }

ম্যাচে কোনও পদ্ধতি কল করার এটিও একমাত্র উপায়। এটি ম্যাচটি পরিবর্তন করবে না, কেবল strip"\ 1" (এটি অপরিবর্তিত রেখে):

"Z_sdsd: sdsd".gsub(/^(Z_.*): .*/, "\\1".strip)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.