Mengonversi string menjadi ruby ​​ekspresi reguler

118

Saya perlu mengonversi string seperti "/ [\ w \ s] + /" menjadi ekspresi reguler.

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

Saya mencoba menggunakan Regexpmetode yang berbeda seperti:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//, serupa Regexp.compiledan Regexp.escape. Tapi tidak satupun dari mereka kembali seperti yang saya harapkan.

Lebih jauh lagi saya mencoba menghapus garis miring terbalik:

Regexp.new("[\w\s]+") => /[w ]+/ Tapi tidak beruntung.

Kemudian saya mencoba melakukannya dengan sederhana:

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

Itu lolos. Sekarang bagaimana mungkin string tetap seperti itu dan diubah menjadi objek regexp?

cmthakur.dll
sumber

Jawaban:

149

Sepertinya di sini Anda membutuhkan string awal dalam tanda kutip tunggal (lihat halaman ini )

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

Agar jelas

  /#{Regexp.quote(your_string_variable)}/

sedang bekerja juga

edit: dibungkus your_string_variable di Regexp.quote, untuk kebenaran.

Sergey Gerasimov
sumber
3
Baru saja mengetahui bahwa Anda tidak dapat menambahkan opsi seperti itu, seperti /#{your_regex}/#{options}.
pduersteler
Saya kira Anda sedang berbicara tentang Rails? optionsadalah Hash, dan Ruby tidak terlalu dinamis =)
Sergey Gerasimov
2
Ini tidak melakukan apa yang diminta OP di Ruby 2.1, ini mengubah "[\ w \ s] +" => / [w] + /
Luca Spiller
1
Harap dicatat bahwa jawaban diberikan pada tahun 2012 :) Pada saat itu semuanya sempurna
Sergey Gerasimov
4
Itu adalah tahun yang sempurna.
Naftuli Kay
35

Metode ini akan dengan aman melepaskan semua karakter dengan arti khusus:

/#{Regexp.quote(your_string)}/

Misalnya, .akan di-escape, karena sebaliknya diartikan sebagai 'karakter apa pun'.

Ingatlah untuk menggunakan string bertanda kutip tunggal kecuali jika Anda ingin interpolasi string biasa diaktifkan, di mana garis miring terbalik memiliki arti khusus.

batu pasir
sumber
2
Bagus karena menjelaskan bagaimana kita dapat melindungi variabel string yang mungkin berisi tanda (seperti +.) yang akan ditafsirkan dalam Regexp.
rchampourlier
1
Ini tidak melakukan apa yang diminta OP di Ruby 2.1, ini mengubah "[\ w \ s] +" => / [w \] \ + /
Luca Spiller
@LucaSpiller Anda perlu menggunakan string yang dikutip tunggal, garis miring terbalik diperlakukan sebagai karakter khusus dalam string yang dikutip ganda, itulah sebabnya misalnya "\n"adalah baris baru tetapi '\n'bukan.
badai pasir mulai
8

Menggunakan% notasi:

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

atau

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

Dari bantuan :

% r [] Ekspresi Reguler Terinterpolasi (bendera dapat muncul setelah pembatas penutup)

BitOfUniverse
sumber
Ini tidak melakukan apa yang diminta OP di Ruby 2.1, ini mengubah "[\ w \ s] +" => / [ws] + /
Luca Spiller
1
@ Luca Spiller, terima kasih, tanda kutip tunggal harus digunakan di sana, saya akan memperbarui jawaban.
BitOfUniverse
5

Permata to_regexp dapat melakukan pekerjaan itu.

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

Anda juga dapat menggunakan pengubah:

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

Terakhir, Anda bisa lebih malas menggunakan: detect

'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/}
ryan
sumber