นิพจน์ทั่วไปของ Ruby โดยใช้ชื่อตัวแปร


105

เป็นไปได้หรือไม่ที่จะสร้าง / ใช้รูปแบบนิพจน์ทั่วไปในทับทิมโดยอิงตามค่าของชื่อตัวแปร

ตัวอย่างเช่นเราทุกคนรู้ว่าเราสามารถทำสิ่งต่อไปนี้ด้วยสตริง Ruby:

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

ฉันต้องการทำสิ่งเดียวกันกับนิพจน์ทั่วไป:

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

เห็นได้ชัดว่ามันไม่ได้ผลตามที่ระบุไว้ฉันแค่ใส่ไว้เป็นตัวอย่างเพื่อแสดงให้เห็นว่าฉันต้องการทำอะไร ฉันต้องการจับคู่ regexp ตามค่าของเนื้อหาของตัวแปร

คำตอบ:


184

รหัสที่คุณคิดว่าใช้ไม่ได้:

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

สิ่งที่น่าสนใจยิ่งขึ้นหาก var สามารถมีเมตา - อักขระนิพจน์ทั่วไปได้ หากเป็นเช่นนั้นและคุณต้องการให้อักขระเหล่านั้นทำในสิ่งที่พวกเขามักจะทำในนิพจน์ทั่วไป gsub เดียวกันจะทำงาน:

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

อย่างไรก็ตามหากสตริงการค้นหาของคุณมีอักขระเมตาและคุณไม่ต้องการให้ตีความเป็นอักขระเมตาให้ใช้ Regexp.escape ดังนี้:

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

หรือให้สตริง gsub แทนนิพจน์ทั่วไป ใน MRI> = 1.8.7 gsub จะถือว่าอาร์กิวเมนต์การแทนที่สตริงเป็นสตริงธรรมดาไม่ใช่นิพจน์ทั่วไป:

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

(ก่อนหน้านี้อาร์กิวเมนต์การแทนที่สตริงเป็น gsub จะถูกแปลงเป็นนิพจน์ทั่วไปโดยอัตโนมัติฉันรู้ว่าเป็นแบบนั้นใน 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 เป็นเพียงสิ่งที่ฉันไม่รู้ว่าต้องการ ขอบคุณ!
Jeff Paquette

regxPlayerVariable = '(. *?) =. *? document \ .getElementById (# {pluginPlayeVariable})' ในสิ่งนี้ฉันใช้ทั้งหมดข้างต้น แต่สิ่งเหล่านี้ไม่ทำงาน
SSP

1
@SSP อาจเป็นการดีที่จะอธิบายปัญหาในคำถามแยกต่างหาก
Wayne Conrad

13

ใช้งานได้ แต่คุณต้องใช้gsub!หรือกำหนดผลตอบแทนให้กับตัวแปรอื่น

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


6

คุณสามารถใช้นิพจน์ทั่วไปผ่านตัวแปรใน Ruby:

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

1
ฉันไม่แน่ใจว่าเหตุใดจึงมีเพียงการโหวตลดลง ฉันลองแล้วและใช้งานได้แม้ว่าคุณจะไม่ต้องการเครื่องหมายทับ regex ทั้งในvarตัวแปรและพารามิเตอร์แรกของ gsub
Tyler Collier

ฉันคิดว่าจุดของเครื่องหมายทับใน gsub คือการแสดงว่า regex สามารถมีตัวแปรซึ่งเป็น regex ได้ ตัวแปรไม่จำเป็นต้องเป็นประเภทสตริง (และจริงๆแล้ว regex จะดีกว่าด้วยเหตุผลที่ระบุไว้ในคำตอบของ Wayne)
mahemoff

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.