Bir dizeyi normal ifade yakutuna dönüştürme


118

"/ [\ W \ s] + /" gibi dizeleri normal ifadeye dönüştürmem gerekiyor.

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

RegexpGibi farklı yöntemler kullanmayı denedim :

Regexp.new("/[\w\s]+/") => /\/[w ]+\//, benzer şekilde Regexp.compileve Regexp.escape. Ama hiçbiri beklediğim gibi dönmüyor.

Dahası, ters eğik çizgileri kaldırmayı denedim:

Regexp.new("[\w\s]+") => /[w ]+/ Ama şansım yok.

Sonra basit yapmaya çalıştım:

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

Kaçar. Şimdi nasıl string olduğu gibi kalabilir ve bir regexp nesnesine dönüşebilir?

Yanıtlar:


149

Görünüşe göre burada tek tırnak içinde olması için ilk dizeye ihtiyacınız var ( bu sayfaya bakın )

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

137

Açık olmak gerekirse

  /#{Regexp.quote(your_string_variable)}/

o da çalışıyor

edit: doğruluk için Regexp.quote içinde your_string_variable sarmaladı.


3
Sadece öğrendim olamaz gibi bu şekilde eklemek seçenekleri /#{your_regex}/#{options}.
pduersteler

Sanırım Rails hakkında konuşuyorsunuz? optionsbir Hash ve Ruby soooo dynamic değil =)
Sergey Gerasimov

2
Bu, OP'nin Ruby 2.1'de istediğini yapmaz, "[\ w \ s] +" => / [w] + /
Luca Spiller

1
Cevabın 2012 yılında verildiğini lütfen unutmayın :) O zamanlar her şey mükemmeldi
Sergey Gerasimov

4
Mükemmel bir yıldı.
Naftuli Kay

35

Bu yöntem, özel anlamı olan tüm karakterlerden güvenli bir şekilde kaçacaktır:

/#{Regexp.quote(your_string)}/

Örneğin, .aksi takdirde 'herhangi bir karakter' olarak yorumlandığından, öncelenecektir.

Ters eğik çizginin özel bir anlamı olduğu normal dize enterpolasyonunun devreye girmesini istemiyorsanız, tek tırnaklı bir dize kullanmayı unutmayın.


2
Güzel, çünkü +.Normal İfade'de yorumlanabilecek işaretler (gibi ) içerebilen dize değişkenini nasıl koruyabileceğimizi açıklıyor .
rchampourlier

1
Bu, OP'nin Ruby 2.1'de istediği şeyi yapmaz, "[\ w \ s] +" => / [w \] \ + /
Luca Spiller

@LucaSpiller, tek tırnaklı bir dizge kullanmanız gerekir, ters eğik çizgi çift tırnaklı dizelerde özel bir karakter olarak değerlendirilir, bu yüzden örneğin "\n"bir satırsonu ama '\n'değil.
sandstrom

8

% Notasyonu kullanarak:

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

veya

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

Gönderen yardımı :

% r [] Aralıklı Normal İfade (bayraklar, kapanış sınırlayıcısından sonra görünebilir)


Bu, OP'nin Ruby 2.1'de istediğini yapmaz, "[\ w \ s] +" => / [ws] + /
Luca Spiller

1
@Luca Spiller, teşekkürler, orada tek alıntılar kullanılmalı, cevabı güncelleyeceğim.
BitOfUniverse

5

Gem to_regexp işi yapabilir.

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

Ayrıca değiştiriciyi de kullanabilirsiniz:

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

Son olarak, şunu kullanarak daha tembel olabilirsiniz: algıla

'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/}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.