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?

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]+/ 

137

Agar jelas

  /#{Regexp.quote(your_string_variable)}/

sedang bekerja juga

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


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.


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)


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/}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.