【问题标题】:Cannot match pagination URLs in Sinatra/Ruby无法匹配 Sinatra/Ruby 中的分页 URL
【发布时间】:2014-09-14 09:41:21
【问题描述】:

我正在尝试匹配这些有效的网址:

/match/<searchterm>
/match/<searchterm>/page/<number>

&lt;searchterm&gt; 是可能包含空格和&amp; 的单词。它不应以尾随空格字符结尾。

一些有效的例子:

/match/Hello
/match/Hello There
/match/Hello There & Bye
/match/Hello & Good Bye
/match/Hello There Lots of & words here

/match/Hello/page/1
/match/Hello There/page/10
/match/Hello There & Bye/page/33

...等等

这些是无效的例子:

/match/Hello!
/match/Hello *
/match/Hello/page
/match/Hello /page/1
/match/Hello There    /page/1

我尝试了几个正则表达式,这个似乎很接近 (according to Rubular):

\/match\/([[\w]+[\s&]*]+)(\/page\/(\d+))*

但它会做一些奇怪的事情,比如成功匹配:

/match/Hello ! There           /page/1

此外,当我在我的 sinatra 应用程序中尝试这个时,Rubular 正则表达式甚至根本不起作用:

get %r{\/match\/([[\w]+[\s&]*]+)(\/page\/(\d+))*} do
   puts 'Matched'
end

即, 当 Rubular 说找不到时,Sinatra 将无法找到此网址:

/match/Hello & There/page/1

这个问题的正确正则表达式是什么?以及为什么 Rubular 中的正则表达式可以工作,但在 Sinatra 中却不行(如示例所示)?

编辑: 我认为 url 中的空格解释了为什么 Sinatra 不匹配有效的正则表达式。提供给 Sinatra 的网址返回为:

/match/Hello%20&%20There

空格实际上不是空格。

编辑 2: Avinash Raj 的正则表达式运行良好,但由于 url 中的空格问题,我不得不将 \s 替换为 %20

新问题:%20 替换\s 是否有效解决此问题?或者 Sinatra 是否有适当的方法来处理 url 中的空格?我在文档中没有看到任何关于它的信息:

http://www.sinatrarb.com/intro#Routes

【问题讨论】:

    标签: ruby regex sinatra


    【解决方案1】:

    您需要在模式中包含开始和结束锚点才能进行精确的行匹配。

    ^\/match\/(\w(?:[\w&\s]|%20)*\w)(?:\/page\/(\d+))*$
    

    DEMO

    Rubular

    【讨论】:

    • 我在 Sinatra 中尝试过,但 Sinatra 无法匹配它:get %r{^\/match/(\w[\w&amp;\s]*\w)(?:\/page\/(\d+))*$} do 失败,例如:/match/Hello &amp; There
    • 您的正则表达式似乎是正确的。我认为问题在于 URL 中的空格(请参阅编辑)。一个有效的解决方案是寻找%20 而不是\s
    • @user21398 更新了包含空格或%20 的链接。它将匹配两种类型的链接..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2013-08-07
    • 1970-01-01
    • 2015-04-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多