ฉันต้องการแทนที่ค่าของสตริงเป็นการแสดงออกปกติของฉันในทับทิม มีวิธีง่ายๆในการทำเช่นนี้หรือไม่? ตัวอย่างเช่น:
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 = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
if goo =~ /value of foo here dynamically/
puts "success!"
end
คำตอบ:
เหมือนกับการแทรกสตริง
if goo =~ /#{Regexp.quote(foo)}/
#...
โปรดทราบว่าRegexp.quote
ในคำตอบจอนลิตรของเป็นสิ่งสำคัญ!
if goo =~ /#{Regexp.quote(foo)}/
หากคุณเพิ่งทำเวอร์ชั่น "ชัดเจน":
if goo =~ /#{foo}/
แล้วระยะเวลาในข้อความจับคู่ของคุณจะถือว่าเป็นสัญลักษณ์ regexp และจะตรงกับ"0.0.0.0"
"0a0b0c0"
โปรดทราบด้วยว่าหากคุณต้องการตรวจสอบการจับคู่สตริงย่อยจริงๆคุณสามารถทำได้ง่ายๆ
if goo.include?(foo)
ซึ่งไม่ต้องการข้อความเพิ่มเติมหรือกังวลเกี่ยวกับอักขระพิเศษ
.quote()
) อาจมีประโยชน์หากคุณต้องการสร้าง regex โดยใช้สตริง
if goo.include?(foo)
" => จริงเมื่อคุณสนใจตรวจสอบการมีอยู่ หากคุณสนใจที่จะเปลี่ยนและใช้งาน String.gsub อยู่แล้ว Regexp.quote อาจเป็นตัวเลือกเดียวของคุณ
Regexp.new
Regexp.compile
อาจRegexp.escape(foo)
จะเป็นจุดเริ่มต้น แต่มีเหตุผลที่ดีที่คุณไม่สามารถใช้การชุมนุมแสดงออกแก้ไข: "my stuff #{mysubstitutionvariable}"
?
นอกจากนี้คุณสามารถใช้!goo.match(foo).nil?
กับสตริงตัวอักษร
Regexp.compile(Regexp.escape(foo))
ใช้ Regexp.new:
if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/
นี่คือคำตอบอื่น ๆ ที่ จำกัด แต่มีประโยชน์:
ฉันค้นพบฉันว่าฉันสามารถแทรกลงใน regex ได้อย่างง่ายดายโดยไม่ต้องใช้ Regexp.quote หรือ Regexp.escape หากฉันเพิ่งใช้เครื่องหมายคำพูดเดี่ยวในสตริงอินพุตของฉัน: (การจับคู่ที่อยู่ IP)
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
สิ่งนี้ช่วยฉันเมื่อฉันต้องการใช้ regex ที่ยาวเหมือนกันหลายครั้ง ไม่ใช่สากล แต่เหมาะกับตัวอย่างคำถามฉันเชื่อ
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0"
puts "success!" if goo =~ /#{foo}/