【问题标题】:Regex is lying to me. But I'm not sure how to fix it正则表达式对我撒谎。但我不知道如何解决它
【发布时间】:2014-04-26 19:57:02
【问题描述】:

我正在制作并且最初可以正常工作,只是因为我很幸运,我正在测试的视频是有效的。请允许我进一步解释。

我想做的是上传 vimeo 内容。通常在 vimeo 的 url 中,数字部分由 7 位或 8 位数字组成,我试图将它们捕获并将它们放在我的 show 和 index.html 中。我最初使它工作并且我认为它功能齐全,但是当我尝试上传更多视频时,结果证明我的模型文件或索引中的正则表达式只允许捕获一位数字。一开始视频会播放,因为带有一位数字的网址恰好是有效的。所以我想知道我做错了什么。我在 rubular 上尝试了一些东西,但我怀疑我想出的正则表达式没有做我认为他们正在做的事情。这是我所拥有的:

validates :url_id, format: { with: /\Ahttp:\/\/vimeo.com\/\d+/ }
validates :url_id, format: { with: /\Ahttp:\/\/vimeo.com\/\d{7,8}/ }

以上代码在我的模型文件中。第一行代码应该可以工作。我希望用户复制粘贴这种格式的 url,因为 vimeo url 在其 url 中有 7 或 8 位数字,这应该验证 url(我认为,Rubular 为我确认了它)。

在我的 index.html 和 show.html 中,我有这个:

<iframe src="http://player.vimeo.com/video/<%=/[0-9]/.match(music_video.url_id)%>"

将 [0-9] 放入 rubular 告诉我它应该捕获 url 中的所有数字,但它只捕获一个数字,即第一个数字。我错过了什么吗? \d+ 会做一些我不知道的事情吗?

【问题讨论】:

  • 只是为了澄清一些事情,正则表达式不要骗我们。相反,我们搞砸了模式,它尽职尽责地返回结果。垃圾进,垃圾出。
  • -1 表示正则表达式在撒谎。

标签: ruby regex vimeo


【解决方案1】:

正则表达式 101:

[0-9]    matches a single character, which must consist of the digits 0 through 9
[0-9]+   matches 1 or more characters, all of which must be the digits 0 through 9
[0-9]*   matches 0 or more characters, all of which must be the digits 0 through 9
[0-9]{n,m} matches at least 'n' chars, up to 'm' chars, all which must be 0 through 9
[0-9]{n,} matches at least 'n', with no upper limit, etc...
[0-9]{,m} matches at MOST 0 up to 'm' worth of characters.

这意味着以下等价物:

[0-9]          [0-9]{1}
[0-9]*         [0-9]{0,}
[0-9]+         [0-9]{1,}

\d 是一种方便,相当于[0-9] 的快捷方式,仅表示“数字”。

【讨论】:

  • 感谢 Marc B。这一澄清非常有帮助。我想知道 Rubular 是否错了,因为当我将示例 url vimeo.com/89908507 放在 rubular 中然后放置 [0-9] 时,它会突出显示所有数字而不仅仅是一个
  • 我建议不要使用{,m},因为并非所有风格都支持它。 {0,m} 是通用的,就像 {n,} 一样。
【解决方案2】:

Rubular 将突出显示所有匹配的序列。在您的示例中,它看起来像匹配整个数字,而它只是单独匹配所有数字。如果你把 ([0-9]) 作为你的模式放在 rubular 中,你会很容易理解这一点。

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 2015-12-17
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多