【发布时间】:2014-09-14 09:41:21
【问题描述】:
我正在尝试匹配这些有效的网址:
/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 中却不行(如示例所示)?
编辑: 我认为 url 中的空格解释了为什么 Sinatra 不匹配有效的正则表达式。提供给 Sinatra 的网址返回为:
/match/Hello%20&%20There
空格实际上不是空格。
编辑 2: Avinash Raj 的正则表达式运行良好,但由于 url 中的空格问题,我不得不将 \s 替换为 %20。
新问题: 用%20 替换\s 是否有效解决此问题?或者 Sinatra 是否有适当的方法来处理 url 中的空格?我在文档中没有看到任何关于它的信息:
【问题讨论】: