无法匹配Sinatra / Ruby中的分页URL

时间:2014-09-13 19:25:57

标签: ruby regex sinatra

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

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

<searchterm>是可能包含空格和&的字词。它不应该以尾随空格字符结尾。

一些有效的例子:

/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却没有(如示例所示)?

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

/match/Hello%20&%20There

这些空格实际上不是空格。

编辑2: Avinash Raj的正则表达式工作正常,但我必须将\s替换为%20,因为网址中存在空格问题。

新问题:将\s替换为%20有效的解决方案吗?或者是否有适当的方式让Sinatra处理网址中的空格?我在文档中没有看到任何关于它的信息:

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

1 个答案:

答案 0 :(得分:0)

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

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

DEMO

Rubular