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.