2016-03-19 94 views
-2

我正在調試carrierwave。好有趣。我認爲這個問題可以歸結爲:正則表達式的樂趣。爲什麼這個正則表達式不匹配我的字符串?

內carrierwave_direct,有這樣的代碼:

if record.new_record? && record.send("has_#{attribute}_upload?") && record.key !~ record.send(attribute).key_regexp 

的#key_regexp代碼是這樣的:

/\A#{store_dir}\/[a-f\d\-]+\/.+\.(?i)#{extension_regexp}(?-i)\z/ 

將計算得到這個當我調試:我的store_dir是這樣的:

「的故事/#{} model.id/main_images」

,我覺得有一個空白的 「/」 部分,因爲model.id爲零。

的record.key是這樣的:

「/stories/main_imagescache/20160319-1549-2202-5826/blueapronimage.jpg」

爲什麼它不符合現在?

它看起來像正則表達式有一個額外的斜槓,我不知道這是什麼部分是:

[a-f\d\-]+\/.+\.(?i)(jpg|jpeg|gif|png)(?-i) 

這是任何數量之間自動對焦,數字或字母「 - 」,然後是「 /「,然後是任意數量的字母或數字,然後是」。「....

什麼是(?i)?

什麼是捕獲組?

什麼是(?-i)?

,我認爲這就是問題所在:

record.key !~ /\Astories/ 
true 

這應該是假的。

+2

將您的RegEx放入[RegExr](http://regexr.com/)或[Regex101](https://regex101.com /)。然後,您可以將鼠標懸停在部件上,它會完全告訴您它的功能。他們都有* Explain *部分,爲您解釋RegEx。 – Druzion

回答

0

看看這個,它解釋它:

[a-f\d\-]+   # Matches a-f, any digit, - (hyphen) 
         #^One or more times (+) 
\/     # Matches a/
.+     # Matches any character one or more times 
\.     # Matches a . (dot) 
(?i)     # States that anything after this is case-insesitive 
         #^Inline Flag 
(jpg|jpeg|gif|png) # Selects file extension 
         #^(either jpg, jpeg, gif, or png) 
(?-i)     # Removes Inline Flag 

這應該解釋每一個做什麼。

也檢查了這個Live Demo。您的示例似乎確實匹配,也許您的代碼的另一部分不正確...

+0

顯然,這是錯誤的行爲:record.key!〜/ \ Astories /它返回true – Jwan622

+0

我把它放在現場演示中,它似乎工作正常,[** see?**](https:// regex101.com/r/jD4pK4/2) – Druzion

相關問題