2012-10-09 41 views
2

我想在一些使用正則表達式的代碼中找到匹配。如何使用變量通過正則表達式匹配這段代碼?

字符串我使用

"input[type=radio],input[type=checkbox] {" 

爲了配合這一點,我添加轉義字符,每架:

"input\[type=radio\],input\[type=checkbox\] \{" 

而且我正在.match找到匹配在一個特定的代碼行:

"input[type=radio],input[type=checkbox] {".match(/input\[type=radio\],input\[type=checkbox\] \{/) 

哪個有效。但是當我把它們變成變量時,它不會。

str = "input[type=radio],input[type=checkbox] {" 
code_to_match_against = "input\[type=radio\],input\[type=checkbox\] \{" 

str.match(/#{code_to_match_against}/) # => nil 

我在做什麼錯?

+2

也許我明智的做法是使用[CSS解析器(https://github.com/alexdunae/css_parser )而不是在事情變得更加複雜的情況下一起黑客入侵。 –

+0

謝謝@AndrewMarshall,之前從未見過。它並沒有比這更復雜,只是將它用於幾個大文件。但我肯定會收藏這個。 – Fralcon

回答

3

雙引號在這裏:

code_to_match_against = "input\[type=radio\],input\[type=checkbox\] \{" 

吃你的反斜槓。試想一下:

>> code_to_match_against = "input\[type=radio\],input\[type=checkbox\] \{" 
>> p code_to_match_against 
"input[type=radio],input[type=checkbox] {" 

所以,當你插code_to_match_against到你的正則表達式,正則表達式引擎認爲你在使用兩類字符:

/input[type=radio],input[type=checkbox] {/ 
#  ^^^^^^^^^^^^  ^^^^^^^^^^^^^^^ 

和字符類匹配只有一個字符時間(除非你追加*+)。

無論是雙反斜線你讓他們過去的雙引號或者使用單引號代替:

>> code_to_match_against = 'input\[type=radio\],input\[type=checkbox\] \{' 
>> p code_to_match_against 
"input\\[type=radio\\],input\\[type=checkbox\\] \\{" 
>> puts code_to_match_against 
input\[type=radio\],input\[type=checkbox\] \{ 
+0

就是這樣!謝謝!我從來沒有想過這件事。我沒有意識到單引號和雙引號會影響它。你有什麼資源可以幫助我充分理解兩者之間的區別嗎? – Fralcon

+1

@Fralcon:也許這[本書的大塊](http://ruby-doc.org/docs/ProgrammingRuby/html/language.html#UD)。我只使用單引號字符串,除非我要插入或需要'\ n'和類似的轉義序列;我在幾年前和幾年前就已經習慣了這種習慣,這對我很好。 –

相關問題