2016-03-19 3 views
-2

Я отлаживаю несущую волну. Это весело. Я думаю, что проблема сводится к следующему:Regex весело. Почему это регулярное выражение не соответствует моей строке?

Внутри 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/ 

, который вычисляет это, когда я отладки:

record.send(attribute).key_regexp 
/\Astories\/\/main_images\/[a-f\d\-]+\/.+\.(?i)(jpg|jpeg|gif|png)(?-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). /). Затем вы можете нависнуть над частями, и он точно скажет вам, что он делает. Оба они также имеют раздел * Объяснение *, объясняющий 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/It возвращает true – Jwan622

+0

Я положил его в Live Demo, кажется, что он отлично работает [** see? **] (https: // regex101.com/r/jD4pK4/2) – Druzion

Смежные вопросы