正则表达的乐趣。为什么这个正则表达式不匹配我的字符串?

时间:2016-03-19 20:20:26

标签: regex

我正在调试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/

在我调试时评估为:

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是nil。

record.key是这样的:

  

“/故事/ main_imagescache / 20160319-1549-2202-5826 / blueapronimage.jpg”

为什么它目前不匹配?

看起来正则表达式有一个额外的斜杠,我不确定这部分是什么:

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

是a-f,数字或“ - ”之间的任意数量的字母,然后是“/”,然后是任意数量的字母或数字,然后是“。”....

什么是(?i)?

什么是捕获组?

什么是(?-i)?

我认为这是问题所在:

record.key !~ /\Astories/
true

应该是假的。

1 个答案:

答案 0 :(得分: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。你的例子确实似乎匹配,也许你的代码的另一部分是不正确的......