การแก้ไขสตริงให้เป็น regex


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 เป็นสตริงย่อยของสารที่หนาหรือไม่? ฉันไม่คิดว่าชัดเจนว่าคุณขออะไร
Neall

ถ้าเป็นเช่นนั้น goo.include? (foo) ก็พอ!
ล็น mcdonald

1
ไม่ฉันไม่ได้พยายามดูว่า foo นั้นเป็นสตริงย่อยของสารที่หนาหรือไม่ ฉันยังต้องทำการจับเช่นกันดังนั้นรวมถึงไม่ทำงาน
Chris Bunch

คำตอบ:



125

โปรดทราบว่าRegexp.quoteในคำตอบจอนลิตรของเป็นสิ่งสำคัญ!

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

หากคุณเพิ่งทำเวอร์ชั่น "ชัดเจน":

if goo =~ /#{foo}/

แล้วระยะเวลาในข้อความจับคู่ของคุณจะถือว่าเป็นสัญลักษณ์ regexp และจะตรงกับ"0.0.0.0""0a0b0c0"

โปรดทราบด้วยว่าหากคุณต้องการตรวจสอบการจับคู่สตริงย่อยจริงๆคุณสามารถทำได้ง่ายๆ

if goo.include?(foo)

ซึ่งไม่ต้องการข้อความเพิ่มเติมหรือกังวลเกี่ยวกับอักขระพิเศษ


3
โปรดทราบว่าการย้อนกลับ (ไม่ใช้.quote()) อาจมีประโยชน์หากคุณต้องการสร้าง regex โดยใช้สตริง
Jesse

"ถ้าคุณต้องการตรวจสอบการจับคู่สตริงย่อยจริงๆคุณสามารถทำได้if goo.include?(foo)" => จริงเมื่อคุณสนใจตรวจสอบการมีอยู่ หากคุณสนใจที่จะเปลี่ยนและใช้งาน String.gsub อยู่แล้ว Regexp.quote อาจเป็นตัวเลือกเดียวของคุณ
Isaac Betesh

เพียงเพื่อเพิ่มไปยังเจสซีในกรณีที่มันไม่ได้เป็นที่เห็นได้ชัดที่นี้หมายถึงเพียงแค่ผ่านสตริงของตัวอักษรที่คุณไม่จำเป็นต้องหนีไปหรือRegexp.new Regexp.compile
dylankb

ขอบคุณสำหรับคำอธิบายที่เป็นประโยชน์ว่าทำไมเราถึงต้องการใช้ Regexp.quote
Wylliam Judd

7

อาจRegexp.escape(foo)จะเป็นจุดเริ่มต้น แต่มีเหตุผลที่ดีที่คุณไม่สามารถใช้การชุมนุมแสดงออกแก้ไข: "my stuff #{mysubstitutionvariable}"?

นอกจากนี้คุณสามารถใช้!goo.match(foo).nil?กับสตริงตัวอักษร




3

นี่คือคำตอบอื่น ๆ ที่ จำกัด แต่มีประโยชน์:

ฉันค้นพบฉันว่าฉันสามารถแทรกลงใน 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 ที่ยาวเหมือนกันหลายครั้ง ไม่ใช่สากล แต่เหมาะกับตัวอย่างคำถามฉันเชื่อ


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

-2
foo = "0.0.0.0"
goo = "here is some other stuff 0.0.0.0" 

puts "success!" if goo =~ /#{foo}/

2
ไม่สิ่งนี้จะให้ "ความจริง" ที่ผิดพลาดสำหรับ "นี่คือสิ่งอื่น ๆ 070x0! 0" เพราะจุดคือสัญลักษณ์ตัวแทน regexp
ล็น mcdonald
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.