แปลงสตริงเป็นทับทิมนิพจน์ทั่วไป


118

ฉันต้องการแปลงสตริงเช่น "/ [\ w \ s] + /" เป็นนิพจน์ทั่วไป

"/[\w\s]+/" => /[\w\s]+/

ฉันลองใช้Regexpวิธีต่างๆเช่น:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//ในทำนองเดียวกันRegexp.compileและRegexp.escape. แต่ไม่มีผลตอบแทนตามที่ฉันคาดไว้

เพิ่มเติมฉันลองลบแบ็กสแลช:

Regexp.new("[\w\s]+") => /[w ]+/ แต่ไม่มีโชค.

จากนั้นฉันก็พยายามทำมันง่ายๆ:

str = "[\w\s]+"
=> "[w ]+"

มันหนีไป ตอนนี้สตริงจะยังคงเหมือนเดิมและแปลงเป็นวัตถุ regexp ได้อย่างไร

คำตอบ:


149

ดูเหมือนว่าที่นี่คุณต้องมีสตริงเริ่มต้นเพื่อให้อยู่ในเครื่องหมายคำพูดเดี่ยว (ดูหน้านี้ )

>> str = '[\w\s]+'
 => "[\\w\\s]+" 
>> Regexp.new str
 => /[\w\s]+/ 

137

ต้องมีความชัดเจน

  /#{Regexp.quote(your_string_variable)}/

ก็ทำงานเช่นกัน

แก้ไข: รวม your_string_variable ไว้ใน Regexp.quote เพื่อความถูกต้อง


3
เพิ่งค้นพบว่าคุณไม่สามารถ/#{your_regex}/#{options}ตัวเลือกผนวกวิธีการที่ชอบ
pduersteler

ฉันคิดว่าคุณกำลังพูดถึง Rails? optionsเป็น Hash และ Ruby ไม่ได้เป็นแบบไดนามิก =)
Sergey Gerasimov

2
สิ่งนี้ไม่ได้ทำตามที่ OP ขอใน Ruby 2.1 แต่จะแปลง "[\ w \ s] +" => / [w] + /
Luca Spiller

1
โปรดทราบว่าคำตอบนั้นได้รับในปี 2555 :) ในเวลานั้นทุกอย่างสมบูรณ์แบบ
Sergey Gerasimov

4
มันเป็นปีที่สมบูรณ์แบบ
Naftuli Kay

35

วิธีนี้จะหลบหนีทุกตัวอักษรที่มีความหมายพิเศษอย่างปลอดภัย:

/#{Regexp.quote(your_string)}/

ตัวอย่างเช่น.จะถูก Escape เนื่องจากถูกตีความเป็น "อักขระใด ๆ "

อย่าลืมใช้สตริงที่มีเครื่องหมายอัญประกาศเดี่ยวเว้นแต่คุณต้องการให้การแก้ไขสตริงปกติเริ่มต้นโดยที่แบ็กสแลชมีความหมายพิเศษ


2
ดีเพราะอธิบายว่าเราสามารถป้องกันตัวแปรสตริงที่อาจมีเครื่องหมาย (เช่น+.) ที่จะตีความใน Regexp ได้อย่างไร
rchampour ก่อนหน้านี้

1
สิ่งนี้ไม่ได้ทำตามที่ OP ขอใน Ruby 2.1 แต่จะแปลง "[\ w \ s] +" => / [w \] \ + /
Luca Spiller

@LucaSpiller คุณต้องใช้สตริงที่มีเครื่องหมายอัญประกาศเดี่ยวแบ็กสแลชจะถือว่าเป็นอักขระพิเศษในสตริงที่ยกมาสองครั้งซึ่งเป็นเหตุผลว่าทำไมเช่นขึ้น"\n"บรรทัดใหม่ แต่'\n'ไม่ใช่
พายุทราย

8

ใช้สัญกรณ์%:

%r{\w+}m => /\w+/m

หรือ

regex_string = '\W+'
%r[#{regex_string}]

จากความช่วยเหลือ :

% r [] Interpolated Regexp (แฟล็กสามารถปรากฏหลังตัวคั่นปิด)


สิ่งนี้ไม่ได้ทำตามที่ OP ขอใน Ruby 2.1 แต่จะแปลง "[\ w \ s] +" => / [ws] + /
Luca Spiller

1
@Luca Spiller ขอบคุณควรใช้คำพูดเดียวที่นั่นฉันจะอัปเดตคำตอบ
BitOfUniverse

5

อัญมณีto_regexpสามารถทำงานได้

"/[\w\s]+/".to_regexp => /[\w\s]+/

คุณยังสามารถใช้ตัวปรับแต่ง:

'/foo/i'.to_regexp => /foo/i

สุดท้ายคุณสามารถขี้เกียจได้มากขึ้นโดยใช้: ตรวจจับ

'foo'.to_regexp(detect: true)     #=> /foo/
'foo\b'.to_regexp(detect: true)   #=> %r{foo\\b}
'/foo\b/'.to_regexp(detect: true) #=> %r{foo\b}
'foo\b/'.to_regexp(detect: true)  #=> %r{foo\\b/}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.