2016-04-20 125 views
0

我經常需要將字符串轉換爲正則表達式。對於很多字符串,Regexp.new(string)就足夠了。但是,如果string包含特殊字符,它們需要進行轉義:將字符串轉換爲Ruby中的正則表達式

string = "foo(bar)" 
regex = Regexp.new(string) # => /foo(bar)/ 
!!regex.match(string) # => false 

RegExp類有一個很好的方式來逃避那些特別的正則表達式中的所有字符:Regexp.escape。它使用像這樣:

string = "foo(bar)" 
escaped_string = Regexp.escape(string) # => "foo\\(bar\\)" 
regex = Regexp.new(escaped_string) # => /foo\(bar\)/ 
!!regex.match(string) # => true 

這確實看起來這應該是默認的方式Regexp.new作品。除了Regexp.new(Regexp.escape(string))之外,還有更好的方法將字符串轉換爲正則表達式嗎?畢竟,這個紅寶石。

+5

'Regexp.new'不應該這樣工作,因爲不能使用「特殊的」正則表達式然後。另外,我認爲'包括'也會做同樣的工作。檢查[*如何檢查一個字符串是否包含Ruby中的子字符串?](http://stackoverflow.com/questions/8258517/how-to-check-whether-a-string-contains-a-substring-in- ruby) –

+1

'String :: include?'是匹配'String'與另一個'String'的最佳方式,但我不認爲它可以輸出'Regexp'。不過,我購買了關於'Regexp.new'的觀點。 –

+1

問題是,你根本不需要一個'Regexp'來檢查字符串是否存在於另一個'String'裏面。這是多餘的複雜/開銷。 –

回答

2

你不應該需要運行Regexp.new(Regexp.escape(string))這是因爲,在覈心和STDLIB,實際上是需要一個正則表達式還需要一個字符串(如它應該)每一個方法。

在原始情況下,如果您嘗試使用特殊字符(如"foo(bar)")與古怪的字符串匹配大字符串big_string,則可以運行big_string.match("foo(bar)")

如果你試圖做一些票友,你可能需要直接組成同時使用::escape::new,但絕不。例如,如果我們想匹配big_string上的一個古怪的字符串後跟一個數字,我們將運行Regexp.new(Regexp.escape(string) + "\\d")

+0

在這裏小心。 '「\ d」'是字符串中的* literal *'d',但'/ \ d /'是正則表達式上下文中的數字。在這種情況下你需要''\\ d「'。 – tadman

+0

是的,這就是我發佈之前未測試代碼的原因。 –

+0

我不認爲這是正確的。 「(foo(bar)」))=># nil',但是「foo(bar)」。 「富(巴)」>' –

相關問題